is_same возвращает false при сравнении экземпляра шаблона класса с шаблоном базового класса? - PullRequest
1 голос
/ 16 мая 2011

* Редактировать: Почему-то я думал, что компилятор создает B точно так же, как A<int, int, string>, что привело к моему предположению о том, как is_same должен их оценивать, независимо от наследования / деривации. Мой плохой :( Извините за последующие недоразумения: \ *

Создание некоторых мета-функций для проверки моих пользовательских типов, и я столкнулся с этой проблемой, но не уверен, что понимаю, что здесь происходит. Я думаю, что могу обойти это, сравнивая элемент this_t известного типа с this_t любого передаваемого параметра, но я просто хочу понять, почему 1-й и 3-й тесты is_same не сработали:

template<typename... Args> struct A {
    typedef A<Args...> this_t;
};

struct B : A<int, int, string> {
};

//tests
std::is_same<A<int, int, string>, B>::value; //false
std::is_same<A<int, int, string>, typename B::this_t>::value; //true
std::is_same<B, typename B::this_t>::value; //false

//more tests for kicks
std::is_base_of<A<int, int, string>, B>::value; //true
std::is_base_of<A<int, int, string>, typename B::this_t>::value; //true
std::is_base_of<B, typename B::this_t>::value; //false

Различается ли is_same по базе A<...>? В чем заметная разница между A<int, int, string> и B?

Ответы [ 3 ]

4 голосов
/ 16 мая 2011

is_same - это в основном шаблон со специализацией

template<class T, class U>
struct is_same : false_type
{ };

template<class T>
struct is_same<T, T> : true_type
{ };

, который никогда не даст вам истину, если у вас точно того же типа.Обратите внимание, что в специализации есть только один T.Он никогда не может совпадать с А и В.

3 голосов
/ 16 мая 2011

Черта is_same имеет значение «истина», только если два переданных ей типа являются абсолютно одинаковыми.B отличается от типа A<int, int, string>.

2 голосов
/ 16 мая 2011

is_same проверяет, являются ли два типа одним типом.

B отличается от типа A<int, int, string>.Как это могло произойти?Это получено из этого.

...