我想将函数作为模板参数传递,但不知何故我无法让它工作。我过去写了很多模板类,但只使用“普通”类型作为参数。我已经搜索过这个问题,但似乎没有什么适合这里。所以我被困住了。
这是我想要实现的目标:我有几个要封装的特定于类型的库函数。我知道还有其他方法可以做到这一点(例如继承),但因为我也想在这里学习一点,所以我想用模板方法来完成它。
我想要达到的目标:
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>>{}
在这种特殊情况下typename
,class
意思是相同的,在那里不需要。但我们不知道T_get_function
这里有什么?将其作为模板的类参数并分配默认类是 C++20 特性。
运算符 & 返回一个指向变量的指针,您不能将其用作引用(并且您不需要这样做)。该元代码包含几十个问题,从缺失;不正确的语法和缺少的关键字和声明。如果您专注于 2020 年之前的 C++ 标准,则应该从头开始重写,否则以 Klaus 的答案为指导。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句