C/C++编程:std::type_info

1059 篇文章 285 订阅
#include <typeinfo>
class type_info;
  • 类type_info保有一个类型的实现指定信息,包括类型的名称和比较两个类型相等的方法和相对顺序。这是 typeid 运算符所返回的类。
  • type_info 既非可复制构造 (CopyConstructible) 亦非可复制赋值(CopyAssignable) 。

在这里插入图片描述

std::type_info::before

在这里插入图片描述

 if(typeid(int).before(typeid(char)))
        std::cout << "int goes before char in this implementation.\n";
    else
        std::cout << "char goes before int in this implementation.\n";

在这里插入图片描述

std::type_info::hash_code

在这里插入图片描述

#include <iostream>
#include <typeinfo>
#include <unordered_map>
#include <string>
#include <functional>
#include <memory>

struct A{
    virtual ~A() {};
};

struct B : A{};

struct C : A{};

using TypeInfoRef = std::reference_wrapper<const std::type_info>;

struct Hasher{
    std::size_t  operator()(TypeInfoRef code) const{
        return code.get().hash_code();
    }
};

struct EqualTo{
    bool operator()(TypeInfoRef lhs, TypeInfoRef rhs) const {
        return lhs.get() == rhs.get();
    }
};

int main()
{
   std::unordered_map<TypeInfoRef, std::string, Hasher, EqualTo> type_names;

   type_names[typeid(int )] = "int";
   type_names[typeid(double )] = "double";
   type_names[typeid(A)] = "A";
   type_names[typeid(B)] = "B";
   type_names[typeid(C)] = "C";

   int i;
   double d;
   A a;

    // 注意我们存储指向 A 的指针
    std::unique_ptr<A> b(new B);
    std::unique_ptr<A> c(new C);

    std::cout << "i is " << type_names[typeid(i)] << '\n';
    std::cout << "d is " << type_names[typeid(d)] << '\n';
    std::cout << "a is " << type_names[typeid(a)] << '\n';
    std::cout << "b is " << type_names[typeid(*b)] << '\n';
    std::cout << "c is " << type_names[typeid(*c)] << '\n';
}

在这里插入图片描述

std::type_info::name

在这里插入图片描述

#include <iostream>
#include <typeinfo>

struct Base{virtual ~Base() = default;};
struct Derived: Base{};

int main()
{
   Base b1;
   Derived d1;

   const Base * pb = &b1;
   std::cout << typeid(*pb).name() << "\n";
   pb = &d1;
   std::cout << typeid(*pb).name() << "\n";
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`std::enable_if` 是 C++11 标准库中的一个模板元编程工具,用于在编译期根据某个条件来选择是否启用某个函数。它通常与函数模板一起使用,用于对函数模板进行条件限定。当条件满足时,函数模板才能被实例化。 `std::enable_if` 的基本语法如下: ```c++ template<bool B, class T = void> struct enable_if {}; template<class T> struct enable_if<true, T> { typedef T type; }; ``` 其中第一个模板定义了一个空类型 `enable_if`,它有两个模板参数:一个布尔类型 `B` 和一个任意类型 `T`,默认为 `void`。第二个模板是一个特化模板,当 `B` 为 `true` 时,它定义了一个名为 `type` 的 `T` 类型别名。 下面是一个使用 `std::enable_if` 的示例: ```c++ #include <iostream> #include <type_traits> template <typename T> typename std::enable_if<std::is_integral<T>::value, T>::type add(T a, T b) { return a + b; } int main() { std::cout << add(1, 2) << std::endl; // 输出 3 // std::cout << add(1.0, 2.0) << std::endl; // 编译错误,因为 double 不是整数类型 return 0; } ``` 在这个示例中,`add` 函数使用了 `std::enable_if` 进行条件限定,只有当模板参数 `T` 是整数类型时,才能被实例化。当 `T` 是整数类型时,返回类型是 `T`,否则编译器会报错。 需要注意的是,`std::enable_if` 只是一个工具,它并不会在运行时对代码进行任何操作。它只是在编译期根据某个条件来决定是否启用某个函数模板。因此,它只能用于编译期的条件判断,不能用于运行时的条件判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值