boost::is_base_of и incomplete type
От: Vain Россия google.ru
Дата: 28.01.08 14:27
Оценка:
Хочу вот это:
#include "boost/type_traits/is_base_of.hpp"

template<class T>
struct B {
  static int _error[boost::is_base_of<B,T>::value ? 1 : -1]; //error C2118: negative subscript
};

struct A : B<A> {};

Может всё-таки можно?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: boost::is_base_of и incomplete type
От: remark Россия http://www.1024cores.net/
Дата: 28.01.08 16:05
Оценка:
Здравствуйте, Vain, Вы писали:

V>Хочу вот это:

V>
V>#include "boost/type_traits/is_base_of.hpp"

V>template<class T>
V>struct B {
V>  static int _error[boost::is_base_of<B,T>::value ? 1 : -1]; //error C2118: negative subscript
V>};

V>struct A : B<A> {};
V>

V>Может всё-таки можно?


Ты не можешь использовать определение типа T в определении типа B, тут получается циклическая зависимость. Это общая проблема CRTP.
Но ты можешь использовать тип Т, например, в определениях функций и т.д.
Например так можно:


template<class T>
struct B {
  ~B()
  {
    static int _error[boost::is_base_of<B,T>::value ? 1 : -1];
  }
};


Или так:

template<class T>
struct B {
  static bool is_base_of() const
  {
    return boost::is_base_of<B,T>::value;
  }
};




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: boost::is_base_of и incomplete type
От: Vain Россия google.ru
Дата: 28.01.08 16:28
Оценка:
Здравствуйте, remark, Вы писали:

R>Но ты можешь использовать тип Т, например, в определениях функций и т.д.

R>Например так можно:
Мне нужно чтобы именно чтобы когда класс наследовался срабатывала проверка, т.к. T может быть только производный класс. Видимо через конструктор/деструктор только и можно
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.