c++ - 指向构造函数重载的指针?

标签 c++ c++11 function-pointers pointer-to-member

我有一堆遗留代码,如下所示:

#define MAKE_FOO_FNS(fooname) \
fooname* makeFoo_ ## fooname ## A(A arg) { \
  return new fooname(arg); \
} \
fooname* makeFoo_ ## fooname ## B(B arg) { \
  return new fooname(arg); \
} \
// ... repeated many more times 

以便稍后在代码中我们可以说:

MAKE_FOO_FNS(FooType1);
MAKE_FOO_FNS(FooType2);

然后可以访问具有以下类型的函数指针:

 FooType1* (*)(A);
 FooType1* (*)(B);
 FooType2* (*)(A);
 FooType2* (*)(B);

我知道我可以替换 MAKE_FOO_FNS使用模板:

template<typename FooType>
FooType* makeFooA(A arg) {
  return new FooType(arg);
}
// .. etc ..

这样我们就可以从&MakeFooA<FooType1>得到函数指针, &MakeFooA<FooType2>等,没有任何宏 hackery。

但这似乎仍然是不必要的样板文件 --- 是否有一种 (C++11) 方法可以将函数指针直接指向“调用 new 的运算符 FooType1 以及采用 A 的构造函数”没有编写所有这些包装函数?

最佳答案

您可以将所有 makeFooA<>()、makeFooB<>() 等函数合并到一个通用模板中:

template<typename T, typename... Args>
T* make_ptr(Args&&... args)
{
    return new T(std::forward<Args>(args)...);
}

这样做的优点是现在可以传递多个参数(通过值或通过引用),缺点是在获取地址时需要指定完整的签名,即 &make_ptr。

注意,如果你有boost,你不需要自己实现:http://www.boost.org/doc/libs/1_61_0/libs/functional/factory/doc/html/

关于c++ - 指向构造函数重载的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37843302/

相关文章:

c++ - Debugbreak()在c++中占用内存吗?

c++ - Boost Graph initialize_vertex 改变顶点颜色(访问者)

c++11 union 包含具有虚函数的数据成员

c++ - 允许枚举类的基于范围的 For?

c++ - 如何使用指向静态成员函数的函数指针作为模板参数?

c++ - Friend 模板函数(在非模板类中),C++

c++ - 错误 : clBuildProgram(CL_BUILD_PROGRAM_FAILURE)

c++ - 在 mac os x 中制作期间出现错误未知类型名称 'constexpr'

c++ - 函数指针基础问题

c++ - 传递函数指针不起作用