Как наследовать конструктор шаблона, который не будет работать с экземплярами базового класса? - PullRequest
0 голосов
/ 18 апреля 2020

У меня много производных классов от базы. Эти классы должны наследовать конструктор от базы, но этот конструктор должен работать только с экземплярами производного или базового класса.

Пример базового класса:

template<typename T, typename U>
struct bar
{ 
  bar() = default;

  template<typename _Bar_or_Derived>
  bar(const _Bar_or_Derived &); // must accept any bar or its derived classes
};

Пример производных классов:

template<typename T, typename U>
struct foo : public bar<T, U>
{ 
  using bar<T, U>::bar; 

 // must inherit something like foo(const Foo_or_Bar&)
};

template<typename T, typename U>
struct not_foo : public bar<T, U>
{ 
  using bar<T, U>::bar; 

 // must inherit something like not_foo(const NotFoo_or_Bar&)
};

Как это сделать?

1 Ответ

1 голос
/ 18 апреля 2020

Кажется, вы хотите CRTP вместо общего базового класса, чтобы избежать дублирования кода:

template <typename > struct Bar;
template <template <typename, typename> class C, typename T1, typename T2>
struct Bar<C<T1, T2>>
{
     Bar(const Bar&) {/*..*/}

     template <typename U1, U2>
     Bar(const Bar<C<U1, U2>>&) {/*..*/}

     template <typename U1, U2>
     Bar(const C<U1, U2>&) {/*..*/}
};
// Maybe you just need template <template <typename, typename> class C> struct Bar{};
// instead, as T1, T2 seems not used

template<typename T, typename U>
struct foo : public bar<foo>
{ 
    using bar<foo>::bar;
};

template<typename T, typename U>
struct not_foo : public bar<not_foo>
{ 
  using bar<not_foo>::bar;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...