模板化类的函数作为模板参数

Function of a templated class as template parameter

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

我想为泛型操作符创建一个模板类。该类将有两个结构体表示一个值作为输入:

struct Value {
   DataType type;
   size_t dataSize;
   char* data;    
};

我已经用老式的切换用例写了一个类型演绎。在将data-ptr转换为该类型之后,我想对输入值应用如下操作:

template<class Operation>
class ApplyOperation {
    Value* operator()(const Value* a, const Value* b) const {
    //find type of a and b
    //cast a and b to their types
    Operation<aT,bT> op;
    return op(a,b);
  }
};

现在我可以为每个操作写一个像这样的小结构体:

template<class A, class B>
struct Add {
  A operator()(A a, B b) const { return a + b; }
};

我看到了一个叫做operator的boost类:http://www.boost.org/doc/libs/1_59_0/libs/utility/operators.htm

,我想用它来达到我的目的。但我不知道怎么积分因为结构体中的算子不是函子。那么可以这样使用它吗?:

ApplyOperation<boost::addable::operator+> add;
add(a,b);

实际上我正在尝试用这个类进行测试:

template<template<class T, class U, class...> class OperatorClass,class F>
struct ApplyOperator {
    template<class T, class U>
    T foo(T a, U b) {
        OperatorClass<T,U> opClass;
        return opClass.operator+(a,b);  //this works of course
    }
};

我想要得到的是:

template<template<class T, class U, class...> class OperatorClass,class F>
struct ApplyOperator {
    template<class T, class U>
    T foo(T a, U b) {
        OperatorClass<T,U> opClass;
        return opClass.F(a,b);
    }
};

实例化如下:

ApplyOperation<boost::addable, operator+> add;

由于未知类型操作符+,这当然不起作用。那么我如何使用模板调用operator+函数呢?

有办法解决这个问题吗?

我不确定我完全理解了这个问题。但是看起来您正在尝试为模板ApplyOperator提供对象实例(而不是类型)。由于operator+绝对不是类型,也不是整型常量,因此无论如何都不能用作模板实参。您需要做的是将操作作为构造函数的参数,而不是对象的类型。