我有以下代码定义Functor模板和函数 running_op,它接受一个数组,它的长度和一个functor来应用 到列表中:
template <class Type>
struct SumFunctor {
Type sum;
SumFunctor() : sum(0) {};
Type operator()(Type next) {
return sum += next;
}
};
template <class Container, class Functor>
inline Container running_op(Container& container, Functor functor) {
transform(container.begin(), container.end(), container.begin(), functor);
return container;
}
以下列方式使用:
list<float> a({1,1,1,1});
running_op(a, SumFunctor<float>());
我希望能够避免键入名称 实例化仿函数中的容器使用它:
list<float> a({1,1,1,1});
running_op(a, SumFunctor);
由于可以在running_op模板中找到包含的a类型 使用Container :: value_type我想做如下的事情 (这不起作用)实例化适当类型的仿函数:
template <class Container, class Functor>
inline Container running_op(Container& container, Functor functor) {
typedef typename Container::value_type ContainerType;
transform(container.begin(), container.end(), container.begin(), functor<ContainerType>());
return container;
}
有什么方法可以通过 未实例化的模板到另一个模板以供以后实例化? 是否有一个特殊的关键字我应该使用除了类以外的 模板参数列表(模板在这种情况下不起作用)?真 我只想传递一个符号,这是一个仿函数模板名称;是 那可能吗?
答案 0 :(得分:2)
您可以使用模板模板。
template <template <class> class Functor, class Container>
inline Container running_op(Container& container) {
typedef typename Container::value_type ContainerType;
transform(container.begin(), container.end(), container.begin(), functor<ContainerType>());
return container;
}
running_op<sum_function>(a);
如果你想要某种语法,你可以使用宏,虽然我不推荐它。
#define running_op(a, b) running_op_<b>(a)