Pat*_*ins 1 c++ member-function-pointers function-pointers c++11
我有一堆遗留代码,如下所示:
#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
Run Code Online (Sandbox Code Playgroud)
所以我们可以在后面的代码中说:
MAKE_FOO_FNS(FooType1);
MAKE_FOO_FNS(FooType2);
Run Code Online (Sandbox Code Playgroud)
然后可以访问具有以下类型的函数指针:
FooType1* (*)(A);
FooType1* (*)(B);
FooType2* (*)(A);
FooType2* (*)(B);
Run Code Online (Sandbox Code Playgroud)
我知道我可以MAKE_FOO_FNS用模板替换:
template<typename FooType>
FooType* makeFooA(A arg) {
return new FooType(arg);
}
// .. etc ..
Run Code Online (Sandbox Code Playgroud)
这样我们就可以得到函数指针&MakeFooA<FooType1>,&MakeFooA<FooType2>等等,无任何宏观两轮牛车.
但是,这仍然似乎是不必要的样板---有没有(C++ 11)的方式来得到一个函数指针直接向"调用运营商new的FooType1与需要一个构造函数A",而无需编写所有的这些包装的功能呢?
您可以将所有makeFooA <>(),makeFooB <>()等函数合并到一个通用模板中:
template<typename T, typename... Args>
T* make_ptr(Args&&... args)
{
return new T(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是现在可以传递多个参数(通过值或通过引用),以及在获取地址时需要指定完整签名的缺点,即&make_ptr.
请注意,如果您有提升,则无需自行实施:http://www.boost.org/doc/libs/1_61_0/libs/functional/factory/doc/html/
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |