使用typeid.name获取auto变量的类型

1. 引入头文件#include <typeinfo>

2. 调用typeid(auto_type_var).name()获取名称

其中typeid操作符得到type_info对象,创建type_info对象的唯一方法是使用typeid操作符

示例

// gettype.c
#include <iostream>
#include <typeinfo>

using namespace std;

int main()
{
        auto i=100;
        cout << typeid(i).name() << endl;
        return 0;
}

编译 g++ -std=c++11 gettype.c -o gettype

输出



本人在protobuf生成的嵌套类型中由于没有g++ 加上-std=c++11参数导致编译报错,后来通过以上方法找到了auto的实际类型,再后来发现   加上-std=c++11参数就能仍旧使用auto关键词类型推断了


proto文件用到的是以下文档的例子

addressbook.proto

Protobuf学习 - 入门

https://www.cnblogs.com/autyinjing/p/6495103.html


最后一行输出auto变量的类型,容易推断出为 addressbook::Person::PhoneNumber*

注: name函数为type_info对象所表示的类型的名字返回C风格字符串。给定类型所用的值取决于编译器,具体来说无须与程序中使用的类型名字匹配。对name返回值的唯一保证是,它为每个类型返回唯一的字符串。【摘自C++ Primer中文版652页】

既 auto help_pn = help_pi.mutable_phone(i);

等价于
addressbook::Person::PhoneNumber* help_pn = help_pi.mutable_phone(i);
### C++ `auto` 关键字的缺点及局限性 尽管 `auto` 提供了极大的便利,尤其是在处理复杂类型时可以简化代码并提高可读性[^3],但它也存在一些潜在的问题和限制: #### 1. **类型不透明** 使用 `auto` 可能会使代码中的变量类型变得不够清晰。对于阅读者来说,如果无法立即看出某个变量的具体类型,则可能增加理解代码的难度。这种情况下,虽然减少了显式类型的书写,但也牺牲了一定程度上的代码透明度[^4]。 #### 2. **可能导致意外的类型推导** 编译器会在编译期根据初始值自动推断出 `auto` 所代表的真实类型。然而,在某些复杂的场景下,比如涉及隐式转换或者重载函数返回值的情况下,可能会得到意想不到的结果。例如: ```cpp auto value = 42; // 推导为 int auto pi = 3.14f; // 推导为 float 而不是 double ``` 需要注意的是,当赋给指针或引用时也需要特别小心,因为这会影响后续操作的行为: ```cpp int a = 0; auto b = &a; // b 是 int* 类型 ``` #### 3. **滥用导致性能问题** 虽然大多数时候 `auto` 并不会直接影响程序运行效率,但如果过度依赖它而忽略了底层实现细节的话,也可能间接引发性能瓶颈。特别是当我们错误地认为某种特定行为会发生却未验证的时候。 #### 4. **缺乏对常量性的控制** 当你希望确保某对象不可修改时,仅通过 `const auto&` 来定义可能是更好的选择;但是如果不加思索地全部采用简单形式 (`auto`) ,则很容易忽略掉这些细微之处从而埋下隐患: ```cpp std::vector<int> vec{1, 2, 3}; for (auto elem : vec) { // 这里拷贝了一份元素而非引用原数据 ++elem; // 修改本地副本无意义 } // 正确做法应改为如下方式之一: // for(auto& elem : vec){...} 或者 const auto& ``` 以上情况表明即使看似简单的语句背后也可能隐藏着深层次逻辑考量。 --- ### 总结 综上所述,尽管引入了像 `using`, `constexpr`, 和其他现代化特性之后使得我们能够更加灵活高效地编写高质量C++应用程序[^1][^2],但在实际应用过程中仍需谨慎对待每一个决策点——包括何时以及如何恰当地运用诸如 `auto` 这样的强大工具。 ```cpp #include <iostream> #include <typeinfo> template<typename T> void PrintType(T&& t){ std::cout << typeid(t).name() << '\n'; } int main(){ auto val = static_cast<double>(7); // 明确指定强制转换后的目标类型 PrintType(val); return 0; } ``` 上述例子展示了即便是在相对基础的操作层面之上仍然存在着诸多值得探讨的地方.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值