c++ - 尝试避免某些特定 C++ 代码的代码重复

标签 c++ templates c++11

我有一些 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/

相关文章:

c++ - 应用程序执行器与 ADsOpenObject 的 lpszUserName

c++ - 使用boost图形库: how to create a graph by reading edge lists from file

templates - 使用可变参数模板建立索引

c++ - 从 enable_if 中的依赖类的 true_type/false_type typedef 获取 bool 值

php - 沙发CMS : if template== then do something

c++ - 如何使模板函数的所有实例成为类的 friend ?

c++ - 使用用户输入动态更改控制台

c++ - 线程锁定互斥量比 std::conditional_variable::wait() 更快

c++ - vector 大小在 for 循环中填充后返回 0

c++ - 是否可以转换参数包中的类型?