在将类模板实例与其基类模板进行比较时,is_same返回false?

时间:2011-05-16 15:02:28

标签: c++ templates c++11 template-meta-programming variadic-templates

* 编辑:不知怎的,我认为编译器正在创建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 个答案:

答案 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特征只有在传递给它的两种类型完全相同时才为真。 BA<int, int, string>的类型不同。

答案 2 :(得分:2)

is_same测试两种类型是否相同。

BA<int, int, string>的类型不同。怎么会这样?它源于它。