* Редактировать: Почему-то я думал, что компилятор создает 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
?