【发布时间】:2012-08-02 04:06:24
【问题描述】:
我广泛使用 boost 共享指针,因此我正在创建一个具有一堆有用/通用功能的类。作为其中的一部分,我想创建环绕 boost::make_shared 的静态成员函数来分配/构造对象的实例。例如,如果类 A 有构造函数:
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 之间的关系是非常机械的,所以我的问题是是否/如何创建一个预处理器宏或基类,它可以自动为每个构造函数提供一个版本的 MakeShared?所以代码看起来像这样:
class A {
A(int arg1, double arg2);
A(int arg1, double arg2, bool arg3);
...
DEFINE_CORRESPONDING_MAKE_SHARED_FUNCTIONS
...
}
使用 boost 预处理器库(或其他库)很好,但较大的项目还没有准备好使用 C++11,所以希望我们可以避免这种情况。
【问题讨论】:
-
真的需要这个吗? make_shared 可以推断类型,因此 make_shared(1, 2.3) 可以正常工作。
-
哦,我不知道 make_shared 可以推断类型 - 我试图避免必须做类似 make_shared(1, 2.3) 之类的事情,但事实并非如此对 1 或 2 个参数不好,但对于更多参数和/或更复杂的类型会变得非常乏味和麻烦。你如何使函数/模板能够推断出这样的参数?作为一个普遍的兴趣点,我想知道如何编写我自己的函数来做到这一点。
-
没关系-我只是查了一下,您所要做的就是在参数中使用模板参数,然后可以从尖括号中省略它。即
template<class T> void f(T arg);可以用int i = 1; f(i)调用,相当于f<int>(i)。我只是不知道 C++ 的那个小特性。感谢您的建议!
标签: c++ boost shared-ptr