首页 > 解决方案 > 复制所有超类构造函数

问题描述

我想向现有类添加一个新的构造函数(扩展boost::dynamic_bitset为允许const char*作为参数)。由于这似乎无法直接执行,因此我可以创建一个boost::dynamic_bitset_plus允许我添加新构造函数的子类。但是,该类有一大堆其他构造函数,我想保留它们。有没有办法在不明确实施每一个的情况下做到这一点?

基本上我可以这样做:

namespace boost
{
    template <typename Block, typename Allocator>
    class dynamic_bitset_plus<Block, Allocator> : public boost::dynamic_bitset<Block, Allocator>
    {
    public:
        // new constructor
        explicit dynamic_bitset_plus(const char* s) : boost::dynamic_bitset<Block, Allocator>(std::string(s)) {}
        // existing constructors - boring but needed
        template <typename CharT, typename Traits, typename Alloc>
        explicit dynamic_bitset_plus(const std::basic_string<CharT, Traits, Alloc>& s,
            typename std::basic_string<CharT, Traits, Alloc>::size_type pos = 0,
            typename std::basic_string<CharT, Traits, Alloc>::size_type n = std::basic_string<CharT, Traits, Alloc>::npos,
            const Allocator& alloc = Allocator()) : boost::dynamic_bitset<Block, Allocator>(s, pos, n, alloc) {}
        // and a bunch of others ...
    };
}

但我正在寻找一种方法来避免指定所有现有的构造函数。

我确实意识到您可以简单地编写一个接受 aconst char*并返回 a的函数,或者在创建 new 时boost::dynamic_bitset简单地调用,但这确实变得乏味并且看起来有点丑 IMO。std::string(...)boost::dynamic_bitset

标签: c++constructorsubclassing

解决方案


using指令可以引入基类构造函数。当我尝试它时,我发现它没有包含默认构造函数,但是很容易包含它;一个空的默认构造函数当然会隐式调用基类。

template <typename Block, typename Allocator>
class dynamic_bitset_plus<Block, Allocator> : public boost::dynamic_bitset<Block, Allocator>
{
public:
    // default constructor
    dynamic_bitset_plus() {}
    // new constructor
    explicit dynamic_bitset_plus(const char* s) : boost::dynamic_bitset<Block, Allocator>(std::string(s)) {}
    // existing constructors
    using boost::dynamic_bitset<Block, Allocator>::dynamic_bitset;
};

推荐阅读