【问题标题】:is_same returning false when comparing class template instantiation with its base class template?将类模板实例化与其基类模板进行比较时,is_same 返回 false 吗?
【发布时间】:2011-05-16 15:02:28
【问题描述】:

*编辑:不知何故,我认为编译器创建 B 就像 A<int, int, string> 一样,导致我假设 is_same 应该如何评估它们,而不管继承/派生如何。我的不好 :( 对后来的误解深表歉意 :\ *

制作一些元函数来检查我的自定义类型,并遇到了这个问题,但不确定我是否理解这里发生了什么。我想我可以通过将已知类型的 this_t 成员与传递的任何参数的 this_t 进行比较来解决它,但我只想了解为什么第一个和第三个 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&lt;...&gt; 基数进行区分? A&lt;int, int, string&gt; 和 B 之间有什么明显区别?

【问题讨论】:

  • 我不明白你的编辑是什么意思,请解释一下。
  • 我的意思是你的答案是在摇摆不定。如果在编译时遇到B 的使用错误,我会收到一条消息,将B 称为A&lt;int, int, string&gt;,而不是B。因此,如果编译器将B 视为A&lt;int, int, string&gt;,那么我不确定为什么 is_same 测试会失败。
  • 还有。你期望什么输出?全部true?还是全部false?还是什么?
  • 那么,您应该询问该错误。显示生成它的代码,并显示错误消息。
  • 来吧伙计们。我是在寻求帮助,而不是赞助“叫我白痴”比赛。我试图了解发生了什么。如果编译器将B 称为A&lt;int, int, string&gt;,那么当我通过is_same 和A&lt;int, int, string&gt; 并要求它与B 进行比较时会给出什么?

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


【解决方案1】:

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。

【讨论】:

  • 我需要澄清一下我的问题,关于我对编译器所做的假设。我正在尝试获取一些代码来显示正在发生的事情。当我这样做时会发布一个编辑。
  • 感谢您的周到回答。我会认为 A 和 B 会失败 is_same,但我对编译器使用 B 所做的事情的假设不正确。不知何故,我认为它正在根据A&lt;int, int, string&gt; 创建B,但事实并非如此:(
【解决方案2】:

is_same trait 仅当传递给它的两个类型是完全相同的类型时才为真。 B 与 A&lt;int, int, string&gt; 的类型不同。

【讨论】:

    【解决方案3】:

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

    B 与A&lt;int, int, string&gt; 的类型不同。怎么会这样?它来源于它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多