在 C++ 中,可以做这样的事情:
class A
{
public:
template <typename ClassType, typename MethodName, typename ...Args>
static func()
{
ClassType t = GetPtr<ClassType>();
t->MethodName(GetArg<Args>()...);
}
}
A::func<B, sum, double, double>(); //should call B->sum(double, double)
A::func<C, sum2, std::string, double, double>(); //should call C->sum2(std::string, double, double)
其中 GetPtr
和 GetArgs
是从字典中获取指针的工作方法。
最佳答案
您可以使用非类型模板参数,例如:
template <typename ClassType, typename MethodType, MethodType MethodName, typename ...Args>
static void func() {
ClassType t = GetPtr<ClassType>();
(t->*MethodName)(GetArg<Args>()...);
}
按如下方式使用它:
A::func<B, double (B::*)(double,double), &B::sum, double, double>();
当您的编译器支持 c++17 时,您的代码甚至可以缩短:
template <typename ClassType, auto MethodName, typename ...Args>
static void func() {
ClassType t = GetPtr<ClassType>();
(t->*MethodName)(GetArg<Args>()...);
}
使用方法:
A::func<B, &B::sum, double, double>();
关于C++ 模板参数作为函数调用名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40072627/