如何查看模板类型参数推导的类型?

2024-01-26

有没有一种简单的方法可以强制编译器向我显示为模板参数推导的类型?例如,给定

template<typename T>
void f(T&& parameter);

const volatile int * const pInt = nullptr;
f(pInt);

我可能想看看推导出什么类型T在通话中f。 (我想这是const volatile int *&,但我不确定。)或者给定

template<typename T>
void f(T parameter);

int numbers[] = { 5, 4, 3, 2, 1 };
f(numbers);

我可能想知道我的猜测是否如此T推论为int*在通话中f是正确的。

如果有第三方库解决方案(例如,来自 Boost),我有兴趣了解它,但我也想知道是否有一种简单的方法来强制进行包含推导类型的编译诊断。


链接时间解决方案:

在我的平台(OS X)上,我可以通过简单地制作一个完整的短程序(减去我感兴趣的函数的定义)来让链接器为我提供此信息:

template<typename T>
void f(T&& parameter);  // purposefully not defined

int
main()
{
    const volatile int * const pInt = nullptr;
    f(pInt);
}

Undefined symbols for architecture x86_64:
  "void f<int const volatile* const&>(int const volatile* const&&&)", referenced from:
      _main in test-9ncEvm.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

不可否认,我得到了“三重引用”,它应该被解释为左值引用(由于引用崩溃),并且是一个分解错误(也许我可以修复它)。


运行时解决方案:

我保留一个type_name<T>()对于此类事情来说功能很方便。完全便携式的是可能的,但对我来说不是最佳的。这里是:

#include <type_traits>
#include <typeinfo>
#include <string>

template <typename T>
std::string
type_name()
{
    typedef typename std::remove_reference<T>::type TR;
    std::string r = typeid(TR).name();
    if (std::is_const<TR>::value)
        r += " const";
    if (std::is_volatile<TR>::value)
        r += " volatile";
    if (std::is_lvalue_reference<T>::value)
        r += "&";
    else if (std::is_rvalue_reference<T>::value)
        r += "&&";
    return r;
}

我可以这样使用它:

#include <iostream>

template<typename T>
void f(T&& parameter)
{
    std::cout << type_name<T>() << '\n';
}

int
main()
{
    const volatile int * const pInt = nullptr;
    f(pInt);
}

对我来说打印出:

PVKi const&

这不是非常友好的输出。您的体验可能会更好。我的平台 ABI 基于安腾ABI http://mentorembedded.github.io/cxx-abi/。这个ABI包括这个函数:

namespace abi
{
    extern "C"
    char*
    __cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status);
}

我可以用它来将 C++ 符号分解为人类可读的形式。更新了type_name<T>()利用这一点的方法是:

#include <type_traits>
#include <typeinfo>
#include <string>
#include <memory>
#include <cstdlib>
#include <cxxabi.h>

template <typename T>
std::string
type_name()
{
    typedef typename std::remove_reference<T>::type TR;
    std::unique_ptr<char, void(*)(void*)> own
        (
            abi::__cxa_demangle(typeid(TR).name(), nullptr, nullptr, nullptr),
            std::free
        );
    std::string r = own != nullptr ? own.get() : typeid(TR).name();
    if (std::is_const<TR>::value)
        r += " const";
    if (std::is_volatile<TR>::value)
        r += " volatile";
    if (std::is_lvalue_reference<T>::value)
        r += "&";
    else if (std::is_rvalue_reference<T>::value)
        r += "&&";
    return r;
}

而现在之前的main()打印出:

int const volatile* const&
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查看模板类型参数推导的类型? 的相关文章

随机推荐

  • Emacs 打开最近的文件很慢!

    直接打开文件时速度很快 但是当我打开最近激活的文件时 在我的文件中添加以下行 emacs require recentf recentf mode 1 setq recentf max menu items 25 global set ke
  • Actionscript 3:如何从外部类访问舞台上的元素?

    我的 as 文件中有一个外部类 我的问题是我无法访问舞台上的元素 像 stage txtfield text 或 this parent txtfield text 这样的代码不起作用 txtfield 是动态文本字段的实例名称 这在一定程
  • Laravel 注册表单上的自定义验证

    我目前正在努力对注册表进行一些验证 基本上 当用户注册时 它会检查他们输入的唯一代码是否有效 如果无效则不允许他们注册 但在我从中读取的代码表中 代码上也有一个到期日期 我需要在认为有效后再次检查到期日期尚未过去 换句话说 它不大于现在 我
  • 编写一个返回值的 jQuery 插件

    我正在编写一个 jQuery 插件 在某些情况下可以存储一些数据 我想以一种非常灵活的方式编写它 我可以更改输入参数来获取插件存储的一些值 解释 当我打电话时 any myPlugin 我的插件初始化创建一个div还有一些a里面 单击一个a
  • C++ 中的全局变量是存储在堆栈、堆还是两者都不存储?

    最初我很确定正确的答案一定是 都不是 因为全局变量存储在数据内存中 但后来我找到了 Robert Lafore 的这本书 名为 C 中的面向对象编程 它明确指出 根据C 标准 全局变量存储在堆上 现在我很困惑 无法真正弄清楚所提出问题的正确
  • 如何在表单完成期间设置外键(python/django)

    在表单处理期间 我希望能够在模型对象上设置外键字段 而无需用户从下拉列表中选择键 例如 models py class AAA models Model some field models TextField class BBB model
  • where 0=0 这样的条件的确切含义是什么?

    我在 Oracle 过程中使用 where 0 0 这样的语句时有点困惑 有人可以澄清一下吗 即使我们这样做是为了动态选择 为什么即使我们在查询中附加了实际条件 也要添加这条语句呢 这个 where 条件会对结果集产生任何影响吗 我经历了如
  • LINQ 中的 GETDATE()

    替代品是什么GETDATE 在 LINQ 中 我从以下帖子中得到了一些解决方法 如何在 Linq to SQL 表达式中使用 SQL 的 GETDATE 和 DATEADD https stackoverflow com questions
  • 如何在 EasyNetQ 中为每个消费者声明自定义错误交换?

    我有四个消费者 当错误发生时 消息发布到默认的 EasyNetQ Default Error Queue 是否可以让每个队列消费者编写自己的错误交换 例如 Queue Name A ErrorExchange A ErrorExchange
  • 未定义 navigator.push React-native 0.43.4

    我正在使用react native的Navigator组件 但当我想推送到anthor页面时仍然出现错误push undefined is not a function这是我的代码 import React Component from r
  • Google 地图路径的 SVG 渐变线

    我正在解释谷歌地图中的 GPS 位置数据 在这里我想创建一条带有渐变的路径 该路径以红色开始 以橙色结束 this https developers google com maps documentation javascript exam
  • std::function 可以序列化吗?

    这是一个理论问题 假设有一些对象 其中包含订阅这些对象的事件的回调函数列表 现在我们想将这些对象存储在磁盘上 是一个std function可序列化 No 每当使用类型擦除 即 将实现细节隐藏在接口后面 时 在不知道对象的动态类型的情况下唯
  • 如何将文本放入绘图的方框内

    我想将文本放在 matplotlib 图上的框中 但是文档 http matplotlib org users recipes html placing text boxes仅给出如何将其放在右上角的示例 并且选择不同的角并不完全简单 这是
  • 将 json 字符串转换为 Java Map(JSONLib)

    如何使用 JSON lib http json lib sourceforge net 将 json 字符串转换为 Java Map 我可以转换为 DynaBean JSONObject jsonObject JSONObject JSON
  • Scanf 似乎无法在带有 GDB 的 Eclipse CDT 中以调试模式工作

    在调试模式下运行此代码时 include
  • 如何在 Django 中使用 DeleteView 显示相关项目?

    我正在做一个视图来从模型中删除实例 使用 Django 中的通用视图DeleteView 但它会级联并删除其他模型中的实例 url r person P
  • UITextView 撤消管理器不适用于替换属性字符串(iOS 6)

    iOS 6 已更新为使用 UITextView 进行富文本编辑 UITextView 现在获得一个 attributeText 属性 该属性是愚蠢的不可变 这是在 NDA 下在 iOS 6 Apple 论坛上提出的问题 由于 iOS 6 现
  • Varchar数据有选择地显示结果

    我正在开发一个应用程序来监控 IP 地址活动 我在 Ubuntu 12 04 上使用 LAMP 堆栈 在mysql数据库中 我创建了一个包含2列的表 ip和mac 数据类型均为varchar 我将一些数据放入表中 当我使用 select f
  • 是否可以手动分解 C++ 符号?

    我收到一些这样的错误 dyld lazy symbol binding failed Symbol not found ZN2nm8RationalIxEC1ERKNS 10RubyObjectE Referenced from Users
  • 如何查看模板类型参数推导的类型?

    有没有一种简单的方法可以强制编译器向我显示为模板参数推导的类型 例如 给定 template