不需要更改界面的解决方案是将函数调用转发到 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编写一次相同的函数,您可以创建一个“特征”,在其中根据类型隔离差异。callFunreturnclassreturn
假设您需要调用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类型而有所不同。