gpt4 book ai didi

C++ 自动为 boost::make_shared 生成包装器

转载 作者:行者123 更新时间:2023-11-28 07:59:53 24 4
gpt4 key购买 nike

我广泛使用 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,因此希望我们可以避免这种情况。

最佳答案

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

#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) );\
}

如果你想变得更有趣,你可以使用 boost 预处理器来自动化宏,但你也可以轻松地在一个宏中实现所有 N 个版本(可能编译速度更快)。

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

此外,我质疑是否需要这样做,因为 make_shared(args...) 本身就可以工作。

关于C++ 自动为 boost::make_shared 生成包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11770904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com