将函数作为模板参数传递给类

和我

我想将函数作为模板参数传递,但不知何故我无法让它工作。我过去写了很多模板类,但只使用“普通”类型作为参数。我已经搜索过这个问题,但似乎没有什么适合这里。所以我被困住了。

这是我想要实现的目标:我有几个要封装的特定于类型的库函数。我知道还有其他方法可以做到这一点(例如继承),但因为我也想在这里学习一点,所以我想用模板方法来完成它。

我想要达到的目标:

MyType<int> myIntObject(...);
...
int writeVal = 10;
myIntObject.Write(writeVal);
...
int readVal;
myIntObject.Read(&readVal);

也许还使用 typedef:

typedef MyType<int> MyIntType;

到目前为止我做了什么:

template<typename T>
struct SetFunction
{
  inline ret_code operator()(someArgs, T value) const {return E_Fail;}
}

template<typename T>
struct GetFunction
{
  inline ret_code operator()(someArgs, T& value) const {return E_Fail;}
}

//template specialization:
template<>
struct SetFunction<int>
{
  inline ret_code operator()(someArgs, T value) const
  {
    //some other code
    return libraryFunctionWriteInt(someArgs, value);
  }
}

template<>
struct GetFunction<int>
{
  inline ret_code operator()(someArgs, T& value) const
  {
    //some other code
    return libraryFunctionReadInt(someArgs, &value);
  }
}
//do the specialization for all other types as well

template<class T, typename T_get_function = GetFunction<T>(), typename T_set_function = SetFunction<T>()>
MyType
{
public:
  MyType(someArgs)
  {
    if(T_get_function(someArgs, &_value) == E_Fail)
    {
      throw someting;
    }
  }

  bool SetValue(T value)
  {
    _value = value;
    //maybe some other code
    return T_set_function(someArgs, _value) == E_Success;
  }

  bool GetValue(T &value)
  {
    //maybe some other code
    return T_get_function(someArgs, &_value) == E_Success;
  }

private:
  T _value;
}

//and then eventually using it (maybe using some typedefs as well)
MyType<int> myIntObject(someArgs);
...
int writeVal = 10;
myIntObject.SetValue(writeValue);
...
int readVal;
myIntObject.GetValue(&readValue);

现在,我得到的编译错误:如复合式功能中投治疗表达式列表上的这两条线在这里我所说的T_set_function / T_get_function我还尝试将库函数直接作为模板参数传递,并且不设置任何默认函数,但我也无法让它以这种方式工作。

到目前为止,我阅读的几乎所有书籍、文章和示例都只处理将“正常”类型作为模板参数传递的问题,但由于 stl 也使用传递函数,我真的很想知道如何做到这一点。

斯威夫特 - 周五派

关于运算符的参数有一些不完整的代码,但语法

template<class T, typename T_get_function = GetFunction<T>(), 
                  typename T_set_function = SetFunction<T>()>

是不正确的。typename T_get_function =建议模板的类型参数,而 = 之后是表达式GetFunction<T>(),而不是声明符。

它应该是

template<class T, typename T_get_function = GetFunction<T>, 
              typename T_set_function = SetFunction<T>>

那么在没有T_get_function::operator()类实例的情况下,您希望如何工作尚不清楚它要么应该是静态的,要么你应该有一个实例。

template<class T, T_get_function getter = GetFunction<T>{}, 
              T_set_function setter = SetFunction<T>>{}

在这种特殊情况下typenameclass意思是相同的,在那里不需要。但我们不知道T_get_function这里有什么?将其作为模板的类参数并分配默认类是 C++20 特性。

运算符 & 返回一个指向变量的指针,您不能将其用作引用(并且您不需要这样做)。该元代码包含几十个问题,从缺失;不正确的语法和缺少的关键字和声明。如果您专注于 2020 年之前的 C++ 标准,则应该从头开始重写,否则以 Klaus 的答案为指导。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章