我广泛使用boost共享指针,所以我创建了一个有用/通用功能的类。作为其中的一部分,我想创建一个静态成员函数来包装boost :: make_shared来分配/构造对象的实例。例如,如果A类具有构造函数:C++自动生成包装boost :: make_shared
class A {
A(int arg1, double arg2);
...
}
然后围绕make_shared看起来像这样相应的包装:
class A {
A(int arg1, double arg2);
static boost::shared_ptr<A> MakeShared(int arg1, double arg2) {
return boost::make_shared<A, int, double>(arg1, arg2);
}
...
}
然后创建一个实例,你只是做:
boost::shared_ptr<A> a_ptr = A::MakeShared(1, 2.3);
显然,构造函数和MakeShared之间的关系是非常机械的,所以我的问题是是否有可能创建一个预处理宏或基类,它可以自动生成cally为每个构造函数制作一个MakeShared版本?这样的代码只是看起来是这样的:
class A {
A(int arg1, double arg2);
A(int arg1, double arg2, bool arg3);
...
DEFINE_CORRESPONDING_MAKE_SHARED_FUNCTIONS
...
}
使用升压预处理程序库(或其他库)是好的,但较大的项目还没有准备好使用C++ 11,所以希望我们能够避免那。
这真的需要吗? make_shared可以推导出类型,因此make_shared (1,2.3)正常工作。 – ThirdOne 2012-08-02 04:18:02
哦,我不知道make_shared可以推断出类型 - 我试图避免做类似make_shared (1,2.3)的东西,这对于1或2个参数来说不算太坏,但对于更多争论和/或更复杂的类型而言,会变得非常繁琐和繁琐。你如何使函数/模板能够推断出这样的参数?作为普遍感兴趣的一点,我想知道如何编写我自己的函数来实现这一点。 – Ken 2012-08-02 17:50:23
没关系 - 我只是查了一下,你所要做的就是在参数中使用模板参数,然后它可以从尖括号中省略。即'template void f(T arg);'可以用'int i = 1; f(i)'相当于'f (i)'。我只是不知道C++的这个小功能。感谢您的建议! –
Ken
2012-08-02 18:02:21