首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11比较两个变量或变量的类型与类型

C++11比较两个变量或变量的类型与类型
EN

Stack Overflow用户
提问于 2022-01-03 17:57:02
回答 1查看 191关注 0票数 1

总之,我希望能够检查对象的类型是否与某种类型匹配,或者两个对象是否匹配类型。

我想要做的事情的实质如下:

代码语言:javascript
复制
    #include <vector>
    #include <iostream>
    #include <type_traits>

    template< class T1, class T2 >
    bool compare_types(T1, T2)
    {
        return std::is_same<T1, T2>::value;   
    }

    class OBJ
    {
        
    };

    int main(int argc, char *argv[])
    {               

        OBJ a;
        OBJ b;
        int c;
        
        
        std::cout<<"\n"<<compare_types(a, b)<<"\n"; // ok and returns true
        //std::cout<<"\n"<<compare_types(c, int)<<"\n"; // compile error, ideally return true
        //std::cout<<"\n"<<std::is_same<c, int>::value<<"\n"; // compile error, ideally return trues
        //std::cout<<"\n"<<compare_types(a, OBJ)<<"\n"; // compile error, ideally return true
        //std::cout<<"\n"<<std::is_same<a, OBJ>::value<<"\n"; // compile error, ideally return true
        //std::cout<<"\n"<<compare_types(a, std::vector)<<"\n"; // compile error, ideally return false
        //std::cout<<"\n"<<std::is_same<a, b>::value<<"\n"; // compile error, ideally return true
        //std::cout<<"\n"<<std::is_same<a, c>::value<<"\n"; // compile error, ideally return false
        //std::cout<<"\n"<<std::is_same<int, float>::value<<"\n"; // compile error, ideally return false
        std::cout<<"\n"<<std::is_same<int, std::int32_t>::value<<"\n"; // ok and returns true
        
        return 0;        
    }
EN

回答 1

Stack Overflow用户

发布于 2022-01-03 18:09:34

  • 函数参数应该是实例。int不是一个实例。这是一种类型。
  • 模板参数可以是类型(和非类型)。

因此,您需要将int的一个实例传递给您的compare_types

代码语言:javascript
复制
    std::cout << compare_types(c, int{}) << '\n';

以及使用c作为模板参数时的类型。幸运的是,decltype(c)提供了以下类型:

代码语言:javascript
复制
    std::cout << std::is_same<decltype(c), int>::value << '\n';

如果继续这种模式,您的程序就会看起来像:

代码语言:javascript
复制
#include <iostream>
#include <type_traits>
#include <vector>

template<class T1, class T2>
bool compare_types(T1, T2) {
    return std::is_same<T1, T2>::value;
}

class OBJ {};

int main(int argc, char* argv[]) {
    OBJ a;
    OBJ b;
    int c;

    std::cout << compare_types(a, b) << '\n'
              << compare_types(c, int{}) << '\n'
              << std::is_same<decltype(c), int>::value << '\n'
              << compare_types(a, OBJ{}) << '\n'
              << std::is_same<decltype(a), OBJ>::value << '\n'
              << std::is_same<decltype(a), decltype(b)>::value << '\n'
              << std::is_same<decltype(a), decltype(c)>::value << '\n'
              << std::is_same<int, float>::value << '\n'
              << std::is_same<int, std::int32_t>::value << '\n';

    // std::cout << compare_types(a, std::vector) << '\n';
}

演示

我不知道你对std::vector的期望是什么。它本身并不是一种类型。它是一个模板,因此它至少需要一个模板参数(或者在C++17和更高版本中,这使得推断T成为可能)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70569670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档