指向构造函数重载的指针?

时间:2016-06-15 18:38:38

标签: c++ c++11 function-pointers member-function-pointers

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

#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)方法直接获取函数指针&#34;使用构造函数调用new的运算符FooType1需要A&#34;没有编写所有这些包装函数?

2 个答案:

答案 0 :(得分:7)

您可以将所有makeFooA&lt;&gt;(),makeFooB&lt;&gt;()等函数合并到一个通用模板中:

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

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

请注意,如果您有提升,则无需自行实施:http://www.boost.org/doc/libs/1_61_0/libs/functional/factory/doc/html/

答案 1 :(得分:2)

是的,只需使用lambda。无捕获的lambda可以隐式转换为函数指针:

X*(*p)(A) = [](A arg){ return new X(arg); };

如果你想要更少的打字和更多的安全性,你也可以只指向std::make_unique的正确专业:

auto p2 = std::make_unique<X, A>;