Вызов конструктора Grandparent с шаблонным наследованием

Я решил использовать шаблонное наследование, чтобы избежать множественного и виртуального наследования. Моя цель — сделать так, чтобы разные дети (4 или 5 поколений или наследование, которые я не контролирую) имели общий вызов функции независимо от того, что они получают.

Мое решение вставляет наследование шаблона следующим образом:

template <typename BASE>
class common_call : public BASE {
public:
void foo() { /*implementation independent of base*/ }
};

class child1 : public common_call <base1> {};
class child2 : public common_call <base2> {};

Это имеет проблему вызова конструктора базы. Классы base1 и base2 (не написанные мной) имеют разные конструкторы, которые я должен вызывать в списке инициализации. Шаблон common_call ничего не знает об этих конструкторах, но дочерние классы делают то, что они в настоящее время наследуют напрямую.

Есть ли способ для меня сделать это:

class child3 : public common_call<base3>{
public:
child3(param1, param2) : base3(param2) {/*do things here*/}
};

Я стараюсь избегать частичных шаблонных специализаций для каждого типа базы, если это возможно.

4

Решение

Если вы даете common_call шаблонный конструктор, использующий шаблоны с переменными числами, подобные этому:

template <typename BASE>
class common_call : public BASE
{
public:
// C++11 variadic templates to define whole range of constructors
template<typename... Args>
common_call(Args&&... args)
:
BASE(std::forward<Args>(args)...)
{}

void foo() { /*implementation independent of base*/ }
};

Вы можете затем извлечь из common_call с любым аргументом шаблона (например, base3) и вызвать любой конструктор, определенный в этом классе

class child3
:
public common_call<base3>
{
public:
child3(Type1 param1, Type2 param2)
:
common_call(param2), // call constructor overload with 1 parameter of Type2
t1_(param1)          // initialize t1_ member
{}

private:
Type1 t1_;
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]