2011-10-09 119 views
2

我有一个类应该被用来将运算符应用到标量或向量以及这两个类的混合。该类可以工作,但我必须手动传递模板参数,而我想他们被从构造函数中扣除。该代码是下面的:带策略的模板参数推导

template <template <class,class> class OP, typename Type1, typename Type2> 
class BinaryOperator : 
    public OP <typename Type1::ReturnType, typename Type2::ReturnType> { 
public: 

    BinaryOperator(Type1* arg1_, Type2* arg2_) : 
     m_arg1(arg1_), 
     m_arg2(arg2_) { 

    } 

    ReturnType evaluate() { 
     return this->apply(m_arg1->evaluate(), m_arg2->evaluate()); 
    } 

private: 
    Type1* m_arg1; 
    Type2* m_arg2; 
}; 

现在,OP是具有完全模板特为属于2个构造函数参数的标量ReturnTypes /矢量的各种组合的结构。 我要明确

new BinaryOperator<op_adder, Axis, Constant>(a1, c2) 

写,而我只想写

new BinaryOperator<op_adder>(a1, c2) 

,并具有轴和恒扣除。编译器错误是:

too few template arguments for class template 'BinaryOperator' 

能有人帮助?我做错了什么? 谢谢 alex

回答

5

类的类型永远不会有推论的模板参数;毕竟,在它甚至知道你想创建什么类之前,编译器如何知道哪些构造函数需要考虑?

解决的办法是编写一个辅助函数,ala std::make_pair

template<typename T, typename U, typename V> 
BinaryOperator<T, U, V> make_binary_operator(const U& u, const V& v) { 
    return BinaryOperator<T, U, V>(u, v); 
}