gpt4 book ai didi

c++ - 将未实例化的模板名称传递到函数模板扩展中

转载 作者:行者123 更新时间:2023-11-30 04:29:45 25 4
gpt4 key购买 nike

我有以下代码定义了一个 Functor 模板和函数running_op,它接受一个数组,它的长度和一个要应用的仿函数到列表:

  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);

因为 a 的包含类型可以在 running_op 模板中找到使用 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;
}

有什么方法可以让我通过未实例化的模板转换为另一个模板以供以后实例化?除了 class 之外,是否有我应该使用的特殊关键字模板参数列表(模板在这种情况下不起作用)?真的我只想传入一个符号,它是仿函数模板名称;是那可能吗?

最佳答案

您可以使用模板模板。

  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)

关于c++ - 将未实例化的模板名称传递到函数模板扩展中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9123518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com