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

时间:2012-02-03 04:04:38

标签: c++ templates functor

我有以下代码定义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;
  }

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

1 个答案:

答案 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)