Как наследовать все определения типов из одного базового класса при множественном наследовании? - PullRequest
3 голосов
/ 14 декабря 2011

Предположим, у меня есть два базовых класса с кучей typedefs:

struct X {
  typedef int type1;
  typedef float type2;
  // A bunch of other typedefs.
};

struct Y {
  typedef long type1;
  typedef char type3;
  // Some other typedefs.
};

struct Z : public X, public Y {
};

Как мне указать, я хочу, чтобы Z наследовал все определения типов от X, без разрешения конфликтов для каждого типа вручную? Я имею в виду код O (1) для достижения этой цели вместо O (n), где n - количество типов конфликтов. Также в случае метапрограммирования точные определения типов в X и Y неизвестны, поэтому ручное разрешение конфликта невозможно.

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

Ответы [ 2 ]

4 голосов
/ 14 декабря 2011

Хм, это работает просто отлично. Вам нужно только разрешить столкновения.

struct X
{
    typedef int type1;
    typedef int type2;
};

struct Y
{
    typedef double type1;
};

struct Z : public X, public Y 
{
    type2 z1;
    typedef X::type1 type1;
    type1 z2;
};

int main()
{
    Z z;
    Z::type2 x;
    Z::type1 y;
}
2 голосов
/ 14 декабря 2011

Используйте private или protected наследование вместо public наследования, а затем используйте оператор using для объявления элементов, которые вы хотите использовать в Z, например:

struct Z : protected X, protected Y
{ 
    using X::type1;
    using X::type2;
    // ...
}; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...