模板参数扣除与策略

Template parameters deduction with policies

本文关键字:策略 参数      更新时间:2023-10-16

我有一个类,应该用于将操作符应用于标量或向量,以及这两个的混合。类可以工作,但我必须手动传递模板参数,而我希望从构造函数中扣除这些参数。代码如下:

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'

有人能帮忙吗?我做错了什么?谢谢亚历克斯

类类型永远不能推导模板参数;毕竟,在知道要创建什么类之前,编译器怎么知道要考虑哪些构造函数呢?

解决方案是编写一个辅助函数,即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);
}