C++ 作为类模板参数的可调用(回调)模板
我想实现这样的目标:C++ 作为类模板参数的可调用(回调)模板,c++,templates,c++11,generic-programming,C++,Templates,C++11,Generic Programming,我想实现这样的目标: template<class IT> size_t foo(IT begin,IT end) {return end-begin;} template<template (class) class FOO> class BAR { public: any_container<any_type> container; size_t call_foo { FOO<any_container<any_t
template<class IT>
size_t foo(IT begin,IT end) {return end-begin;}
template<template (class) class FOO>
class BAR
{
public:
any_container<any_type> container;
size_t call_foo
{
FOO<any_container<any_type>::iterator>(container.begin(), container.end());
}
};
此外,我希望能够将函数、lambda或函数对象作为FOO传递。
这里可能应该使用std::function,但不能用任意类型T声明std::function。
我当然不想在模板栏参数列表中指定内部容器或其迭代器的类型
有什么办法可以优雅地解决这个问题吗?根据你的评论,我认为你在寻找这样的东西:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <utility>
#include <vector>
struct Sender {
template<typename Iter>
std::size_t operator()(Iter begin, Iter end) {
for(Iter cur = begin; cur != end; ++cur) {
// your low-level send stuff
}
return (end - begin);
}
};
struct Receiver {
template<typename Iter>
std::size_t operator()(Iter begin, Iter end) {
for(Iter cur = begin; cur != end; ++cur) {
// your low-level receive stuff
}
return (end - begin);
}
};
template<typename Fn>
struct Bar
{
protected:
Fn _fn;
public:
Bar(Fn fn) : _fn(std::move(fn)) { }
template<typename Container>
std::size_t call_fn(Container & container)
{
return _fn(std::begin(container), std::end(container));
}
};
template<typename Fn>
auto create_bar(Fn && fn) -> Bar<typename std::remove_reference<Fn>::type> {
return { std::forward<Fn>(fn) };
}
用法很简单:
template<typename Iter>
std::size_t my_foo(Iter begin, Iter end) {
return (end - begin);
}
int main(int argc, char ** argv) {
typedef typename std::vector<int>::iterator iter;
// functors
auto functor = create_bar(Sender());
// lambdas
auto lambda = create_bar([](iter begin, iter end) -> std::size_t { return (end - begin); });
// plain old functions
auto function = create_bar(&my_foo<iter>);
std::vector<int> tmp = { 0, 1, 2, 5};
std::cout << "Functor: " << functor.call_fn(tmp) << std::endl;
std::cout << "Lambda: " << lambda.call_fn(tmp) << std::endl;
std::cout << "Function: " << function.call_fn(tmp) << std::endl;
return 0;
}
Live example您知道std::begin和std::end吗?在您的示例中,foo的用途是什么?什么是容器?BAR是通用协议实现,foo是依赖于系统的低级发送或接收实现。std::begin和end有何帮助?看起来几乎可以,但您必须声明iter才能与lambda或函数一起使用。另一方面:您正在声明包装器类,这有点复杂。我仍然希望有可能使解决方案更纯粹。