首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在编译时打印导出的模板参数

在编译时打印导出的模板参数
EN

Stack Overflow用户
提问于 2021-06-16 22:09:17
回答 3查看 146关注 0票数 0

如何在编译时自动打印出模板参数?

代码语言:javascript
复制
std::pair x(1, 2.0);

在上面的例子中,x的类型是std::pair。是否有方法在编译时打印导出的x类型,例如std::pair或其他可读的形式?

编辑。我正在使用一个库(DPC++),它依赖于C++ 17自动模板参数推导。有时很难猜测模板参数是如何推导出来的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-17 00:22:53

这里有一种(诚然是迂回而冗长的)方法:

代码语言:javascript
复制
#include <utility>

template <class T>
struct type_reader {
    type_reader() {
        int x{0};
        if (x = 1) {} // trigger deliberate warning
    }
};

int main() {
    std::pair x(1, 2.0);
    type_reader<decltype(x)> t;
}

根据编译器和设置的不同,您可以得到如下警告

代码语言:javascript
复制
<source>:7:19: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
        if (x = 1) {} // trigger deliberate warning
<source>:13:34: note: in instantiation of member function 'type_reader<std::pair<int, double>>::type_reader' requested here
    type_reader<decltype(x)> t;

如果你斜视的话,你可以在混乱的地方看到std::pair<int, double>>类型。

票数 1
EN

Stack Overflow用户

发布于 2021-06-17 10:19:33

在我看来,你问的是两个不同的独立问题。

  1. 给出了一个从CTAD得到的对象,如何得到该对象的精确类型。

对于这个问题,答案很简单:这是decltype()的一项工作,允许

代码语言:javascript
复制
std::pair x{1, 2.0};

decltype(x) y{2, 3.0};  // y is std::pair<int, double>

static_assert( std::is_same_v<decltype(x), std::pair<int, double>> );
static_assert( std::is_same_v<decltype(y), std::pair<int, double>> );

  1. 如何以人类可读的形式打印对象的类型?

C++提供了一个操作符typeid(),它返回类std::type_info的一个对象,其中包括返回类型的C样式字符串描述的name()方法。

所以你可以写

代码语言:javascript
复制
std::pair x{1, 2.0};

std::cout << typeid(x).name() << '\n';

不幸的是,描述字符串是特定于实现的,对于非平凡的类型来说,它并不真正描述人类。

例如,从该代码中,我获得了

St4pairIidE

来自g++和

NSt3__14pairIidEE

来自clang++。

显然,如果您对为std::pair推导的模板参数感兴趣,您可以推断出单个类型(intdouble)并打印它们。

例如,您可以编写如下函数

代码语言:javascript
复制
template <typename T1, typename T2>
void print_pair_types (std::pair<T1, T2> const &)
 {
   std::cout << "First pair type: " << typeid(T1).name() << std::endl;
   std::cout << "Second pair type: " << typeid(T2).name() << std::endl;
 }

然后用x呼叫它

代码语言:javascript
复制
std::pair x{1, 2.0};

print_pair_types(x);

从g++和clang++获得

第一对类型:i第二对类型: d

票数 1
EN

Stack Overflow用户

发布于 2021-12-13 10:45:10

到目前为止,我发现在编译时打印导出的任何类型的最快速和最简单的方法是将其除以nullptr

代码语言:javascript
复制
#include <tuple>

int main() {
    auto a = std::make_tuple(0, 10ul, +[](int&&) -> int { return 42; });
    a / nullptr;
}

GCC的产出如下:

代码语言:javascript
复制
 In function 'int main()':
5:7: error: no match for 'operator/' (operand types are 'std::tuple<int, long unsigned int, int (*)(int&&)>' and 'std::nullptr_t')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68010592

复制
相关文章

相似问题

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