2012-08-02 75 views
0

我广泛使用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,所以希望我们能够避免那。

+6

这真的需要吗? make_shared可以推导出类型,因此make_shared (1,2.3)正常工作。 – ThirdOne 2012-08-02 04:18:02

+0

哦,我不知道make_shared可以推断出类型 - 我试图避免做类似make_shared (1,2.3)的东西,这对于1或2个参数来说不算太坏,但对于更多争论和/或更复杂的类型而言,会变得非常繁琐和繁琐。你如何使函数/模板能够推断出这样的参数?作为普遍感兴趣的一点,我想知道如何编写我自己的函数来实现这一点。 – Ken 2012-08-02 17:50:23

+0

没关系 - 我只是查了一下,你所要做的就是在参数中使用模板参数,然后它可以从尖括号中省略。即'template void f(T arg);'可以用'int i = 1; f(i)'相当于'f (i)'。我只是不知道C++的这个小功能。感谢您的建议! – Ken 2012-08-02 18:02:21

回答

1

这可以预先定义的数量的参数来实现:

#define DEFINE_MAKE_SHARED_FUNCTIONS(CLASS_TYPE) \ 
    template<typename A1> \ 
    static boost::shared_ptr<CLASS_TYPE> make_shared(const A1& a) {\ 
     return boost::make_shared<CLASS_TYPE>(a);\ 
    }\ 
    template<typename A1,typename A2> \ 
    static boost::shared_ptr<CLASS_TYPE> make_shared(const A1& a, const A2& a2) {\ 
     return boost::make_shared<CLASS_TYPE>(a, b));\ 
    } 

如果你想获得看上你可以使用升压预处理程序自动执行宏,但你可以很容易地实现所有的N个版本在一个宏中(可能编译得更快)。

您可以使用veridic模板来减少对宏的需求,但目前不可移植(不支持VC++)。

此外,我质疑这个作为make_shared(args ...)的需求本身。

+0

你还没有意识到你正试图在静态成员函数中使用这个指针。 – 2012-08-03 02:19:42

+0

egad ...你是对的。为宏的参数添加类型。 – bytemaster 2012-08-03 02:56:42