копирование всех конструкторов суперкласса - PullRequest
0 голосов
/ 30 ноября 2018

Я хотел бы добавить новый конструктор в существующий класс (расширение 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 ...
    };
}

, но я ищу способ избежать указаниявсе существующие конструкторы.

Я понимаю, что вы могли бы просто написать функцию, которая принимает const char* и возвращает boost::dynamic_bitset, или просто вызывать std::string(...) при создании нового boost::dynamic_bitset, но этостановится утомительным и выглядит немного некрасиво ИМО.

1 Ответ

0 голосов
/ 30 ноября 2018

Директива 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;
};
...