Есть ли способ предотвратить получение класса в два раза с использованием статического утверждения и черты типа?

StackOverflow https://stackoverflow.com/questions/8851583

Вопрос

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

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))
};
Это было полезно?

Решение

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

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

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

Другие советы

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

если ты В самом деле Хотите, чтобы вы проверили оба базовых класса:

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
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top