自学内容网 自学内容网

C++如何输出变量的类型

目录

1. 使用 typeid 和 name() 方法

2. 使用编译器特定的宏

3. 使用模板元编程

4. 使用第三方库

安装 Boost.TypeIndex

使用 Boost.TypeIndex

5. 使用 C++17 的 std::type_identity

示例完整代码


在 C++ 中,输出变量的类型通常涉及到运行时类型识别(RTTI,Run-Time Type Identification)。C++ 提供了 typeid 操作符来获取类型信息,并通过 std::type_info 类来表示类型信息。

下面是一些方法来输出变量的类型:

1. 使用 typeid 和 name() 方法

typeid 操作符可以用于获取变量或类型的 std::type_info 对象,然后使用 name() 方法来获取类型名称。

#include <iostream>
#include <typeinfo>

int main() {
    int i = 10;
    double d = 3.14;

    std::cout << "Type of i: " << typeid(i).name() << std::endl;
    std::cout << "Type of d: " << typeid(d).name() << std::endl;

    return 0;
}

这种方法依赖于 RTTI(Run-Time Type Information),在运行时才能获取类型信息。 

2. 使用编译器特定的宏

一些编译器提供了特定的宏来获取更友好的类型名称,例如 GCC 的 __PRETTY_FUNCTION__

#include <iostream>

int main() {
    int i = 10;
    double d = 3.14;

    std::cout << "Type of i: " << __PRETTY_FUNCTION__ << std::endl;
    std::cout << "Type of d: " << __PRETTY_FUNCTION__ << std::endl;

    return 0;
}

注意:这种方法依赖于编译器的实现,并且通常用于调试目的。

3. 使用模板元编程

如果需要在编译时获取类型信息,可以使用模板元编程技术。这种方法不涉及 RTTI,而是通过模板特化来实现类型输出。

#include <iostream>

template <typename T>
struct TypeName {
    static const char* name() {
        return typeid(T).name();
    }
};

template <>
struct TypeName<int> {
    static const char* name() {
        return "int";
    }
};

template <>
struct TypeName<double> {
    static const char* name() {
        return "double";
    }
};

int main() {
    int i = 10;
    double d = 3.14;

    std::cout << "Type of i: " << TypeName<decltype(i)>::name() << std::endl;
    std::cout << "Type of d: " << TypeName<decltype(d)>::name() << std::endl;

    return 0;
}

4. 使用第三方库

有些第三方库提供了更友好的类型输出功能,例如 Boost.TypeIndex。

安装 Boost.TypeIndex

首先需要安装 Boost 库:

sudo apt-get install libboost-all-dev
使用 Boost.TypeIndex
#include <iostream>
#include <boost/type_index.hpp>

int main() {
    int i = 10;
    double d = 3.14;

    std::cout << "Type of i: " << boost::typeindex::type_id_with_cvr<decltype(i)>().pretty_name() << std::endl;
    std::cout << "Type of d: " << boost::typeindex::type_id_with_cvr<decltype(d)>().pretty_name() << std::endl;

    return 0;
}

Boost.TypeIndex 提供了 type_id_with_cvr 函数,它可以返回一个 type_index 对象,该对象提供了 pretty_name() 方法来获取类型名称。

5. 使用 C++17 的 std::type_identity

C++17 引入了 std::type_identity,可以用来获取类型名称。

#include <iostream>
#include <type_traits>
#include <typeinfo>

template <typename T>
constexpr const char* typeName() {
    return std::type_identity<T>::type::name();
}

int main() {
    int i = 10;
    double d = 3.14;

    std::cout << "Type of i: " << typeName<int>() << std::endl;
    std::cout << "Type of d: " << typeName<double>() << std::endl;

    return 0;
}

示例完整代码

下面是一个完整的示例代码,展示了如何使用 typeidname() 方法来输出变量的类型:

#include <iostream>
#include <typeinfo>

int main() {
    int i = 10;
    double d = 3.14;

    std::cout << "Type of i: " << typeid(i).name() << std::endl;
    std::cout << "Type of d: " << typeid(d).name() << std::endl;

    return 0;
}

输出结果可能会显示类似于 intdouble 的类型名称,具体取决于编译器的实现。


原文地址:https://blog.csdn.net/m0_73800602/article/details/141966184

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!