不需要更改界面的解决方案是将函数调用转发到 a template<> class
,您可以在其中专注于您的内心内容:
template<typename R, typename... Ts>
struct DoCallFun {
R operator()( LuaScript* self, std::string const& name, Ts&&... ts ) {
}
};
template <typename Z, typename... T>
Z LuaScript::callFun(const std::string& name, Ts&&... ts) {
return DoCallFun<Z, Ts...>()( this, name, head, std::forward<Ts>(ts)... )
}
callFun
我们实现了 inside的主体DoCallFun
。如果它需要访问私有变量,LuaScript
我们创建DoCallFun
一个friend
.
现在,更好的解决方案可能是class
对大部分return
依赖于 -type 的行为使用“特征”。如果您需要根据类型调用不同的函数,而不是为每个稍有差异的类型return
编写一次相同的函数,您可以创建一个“特征”,在其中根据类型隔离差异。callFun
return
class
return
假设您需要调用int CallAndReturnInt(...)
if type isint
和double CallAndReturnDouble(...)
if type is double
。不要有两个主体,而是callFun
编写一个特征类:
template<typename T>
struct lua_return_traits;
template<>
struct lua_return_traits<int> {
template<typename... Ts>
static int call_and_return( Ts&&... ts ) {
return CallAndReturnInt( std::forward<Ts>(ts) );
}
};
template<>
struct lua_return_traits<double> {
template<typename... Ts>
static double call_and_return( Ts&&... ts ) {
return CallAndReturnDouble( std::forward<Ts>(ts) );
}
};
以及其他方式的类似技术,您的方法应根据return
类型而有所不同。