我有一些 C++ 代码,其中包含以下模式的重复:
int Func(Type1 arg1, Type2 arg2)
{
RAIILock lock(Singleton::Mutex());
Instance* ptr = GetClassInstance();
if (ptr) {
return ptr->Func(arg1, arg2);
} else {
return -1;
}
}
基本上,它试图在锁下获取一个有效的类实例指针,并实质上将调用从这个普通函数转发到具有相同签名的实例方法。 “Func”名称以及参数的数量和类型各不相同,但其余调用是相同的。
感觉应该有某种方法可以使用模板来实现这一点,而无需过多地使用模板魔法,但我一直无法想出任何办法。
最佳答案
类似的东西?
template <class MEM_FUN, class... ARGS>
auto call_func(MEM_FUN&& f, ARGS&&... args)
{
RAIILock lock(Singleton::Mutex());
Instance* ptr = GetClassInstance();
if (ptr) {
return (ptr->*f)(std::forward<ARGS>(args)...);
} else {
return -1;
}
}
这样调用:
call_func(&Instance::Func, arg1, arg2, arg3);
关于c++ - 尝试避免某些特定 C++ 代码的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34726676/