我有一堆的旧代码看起来像:#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>等获取函数指针,而无需任何宏黑客。但这似乎仍然是不必要的样板---(C++ 11)是否有一种方法可以直接获取指向“使用带有new的构造函数调用FooType1的A的运算符ojit_code”的函数指针,而无需编写所有这些包装函数? 最佳答案 您可以将所有makeFooA (),makeFooB ()等功能合并到一个通用模板中:template<typename T, typename... Args>T* make_ptr(Args&&... args){ return new T(std::forward<Args>(args)...);}这样做的好处是现在可以传递多个参数(通过值或引用),并且缺点是在获取地址(即&make_ptr)时需要指定完整签名。请注意,如果您有增强功能,则无需自己实现:http://www.boost.org/doc/libs/1_61_0/libs/functional/factory/doc/html/关于c++ - 指向构造函数重载的指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37843302/
10-11 16:03