【问题标题】:Comparing typenames in C++比较 C++ 中的类型名
【发布时间】:2021-08-06 14:36:44
【问题描述】:

我把它输入到一个模板函数中,只是想看看它是否可以工作:

if (T==int)

智能感知没有抱怨。这是有效的 C++ 吗?如果我这样做了会怎样:

std::cout << (int)int;  // looks stupid doesn't it.

【问题讨论】:

  • 智能感知 != 编译器
  • ...它是否有效?如果是这样,关于内部工作原理的一点解释会很棒。
  • @Travis G,你应该把它作为答案发布......它真的值得点赞...... :)
  • @liaK:哈……我认为詹姆斯的回答值得称赞,因为它提供了丰富的信息。
  • 如果您比较类型名的原因是为了允许对某些数据类型进行特殊处理,您可以简单地使用模板专业化。

标签: c++


【解决方案1】:

为了满足您的要求,您应该使用typeid 运算符。那么你的表情会是这样的

if (typeid(T) == typeid(int)) {
    ...
}

明显的示例来说明这确实有效:

#include <typeinfo>
#include <iostream>

template <typename T>
class AClass {
public:
    static bool compare() {
        return (typeid(T) == typeid(int));
    }
};

void main() {
    std::cout << AClass<char>::compare() << std::endl;
    std::cout << AClass<int>::compare() << std::endl;
}

所以在标准输出中你可能会得到:

0
1

【讨论】:

    【解决方案2】:

    不,这不是有效的 C++。

    IntelliSense 不够聪明,无法发现代码中的所有问题;它必须完全编译代码才能做到这一点,并且编译 C++ 非常慢(对于 IntelliSense 来说太慢了)。

    【讨论】:

      【解决方案3】:

      这是你想要做的吗?

      if(typeid(T) == typeid(int))
      

      还有这个?

      cout << typeid(int).name();
      

      【讨论】:

        【解决方案4】:

        您可能甚至没有实例化您的模板,这就是它编译的原因。

        【讨论】:

          【解决方案5】:

          不,你不能使用 if (T == int) 和 std::cout

          【讨论】:

            【解决方案6】:

            从C++11开始,可以使用std::is_same&lt;T1, T2&gt;::value

            【讨论】:

              猜你喜欢
              • 2014-08-19
              • 2023-03-26
              • 2012-09-14
              • 1970-01-01
              • 2015-02-10
              • 2020-01-06
              • 1970-01-01
              • 1970-01-01
              • 2019-09-28
              相关资源
              最近更新 更多