2012-02-03 72 views
1

我有下面的代码定义一个仿函数模板和功能 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); 

由于的所包含的类型可以使用集装箱:: VALUE_TYPE的running_op模板 找到我想做点什么如下 (不工作)来实例化适当类型的函子:

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

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

回答

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) 
+0

我想我尝试了类似的东西,它接近我想要的东西,但我仍然好奇,如果我可以按照我在没有宏的问题中概述的方式来做到这一点。 – 2012-02-03 04:26:08

+0

不错,够近。感谢你的回答。 – 2012-02-03 04:50:22