* 编辑:不知怎的,我认为编译器正在创建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
之间有什么明显的区别?
答案 0 :(得分:4)
is_same基本上是一个具有专业化的模板
template<class T, class U>
struct is_same : false_type
{ };
template<class T>
struct is_same<T, T> : true_type
{ };
除非你有完全相同类型,否则永远不会给你真实。请注意,专业化中只有一个T
。它永远不会匹配A和B.
答案 1 :(得分:3)
is_same
特征只有在传递给它的两种类型完全相同时才为真。 B
与A<int, int, string>
的类型不同。
答案 2 :(得分:2)
is_same
测试两种类型是否相同。
B
与A<int, int, string>
的类型不同。怎么会这样?它源于它。