Учитывая следующий базовый класс:
class Base {
int a, b;
public:
Base(int a, int b=42): a(a), b(b) { }
};
И класс, производный от базы:
class Derived: public Base {
using Base::Base; // inherit Base constructors
bool c;
public:
Derived(int a): Base(a), c(true) { }
Derived(int a, int b): Base(a, b), c(true) { }
};
Есть ли способ избежать создания двух отдельныхконструкторы для Derived
и вместо этого перегружают унаследованные Base
конструкторы для инициализации дополнительного члена Derived
?
Я думал использовать что-то вроде этого:
template <typename... Args,
typename std::enable_if_t<std::is_constructible_v<Base, Args&&...>, int> = 0>
explicit Derived(Args&&... args):
Base(std::forward<Args>(args)...), c(true) {}
Этоclose, но слишком многословно и не работает, если конструкторы базового класса наследуются.т. е. если в классе присутствует using Base::Base
(то по умолчанию используются эти конструкторы и не инициализируется поле b
).
Однако это работает, если унаследованные конструкторы базового класса отсутствуют, т.е. удаляются using Base::Base
.
Это единственный способ получить эту работу?то есть путем удаления using Base::Base
и использования конструктора шаблонов variadic в каждом производном классе?Есть ли менее подробный способ перегрузки унаследованных конструкторов?
Я использую C ++ 17.