Есть ли способ предотвратить двойное наследование класса, используя статические атрибуты assert и type? - PullRequest
4 голосов
/ 13 января 2012

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

class A {};
class B : public A {};
class C : public A {};

class D : public B, public C
{
    BOOST_STATIC_ASSERT((is_base_of_once<A,D>::value))
};

Ответы [ 3 ]

4 голосов
/ 13 января 2012

Должно работать следующее:

BOOST_STATIC_ASSERT(((A*)(D*)0 == 0)) 

Если A существует дважды, это должно приводить к ошибке неоднозначности, в противном случае тест всегда будет успешным (поскольку сравниваются два нулевых указателя).

0 голосов
/ 13 января 2012

Если вы действительно хотите, вы тестируете оба своих базовых класса:

class A {};
class B : public A {};
class C : public A {};

class D : public B, public C
{
    static_assert(!(is_base_of<A,B>::value && is_base_of<A,C>::value),
                   "Invalid inheritance!");
};

В противном случае вы можете заставить классы наследоваться виртуально от A, так что в производном классе все еще будет только один его экземпляр:

class A {};
class B : public virtual A {};
class C : public virtual A {};

class D : public B, public C
{
    // only one A here
};
0 голосов
/ 13 января 2012

Когда я пытаюсь получить класс дважды, как у вас здесь, он даже не компилируется.(дубликат базового типа)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...