如何在编译时自动打印出模板参数?
std::pair x(1, 2.0);在上面的例子中,x的类型是std::pair。是否有方法在编译时打印导出的x类型,例如std::pair或其他可读的形式?
编辑。我正在使用一个库(DPC++),它依赖于C++ 17自动模板参数推导。有时很难猜测模板参数是如何推导出来的。
发布于 2021-06-17 00:22:53
这里有一种(诚然是迂回而冗长的)方法:
#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;
}根据编译器和设置的不同,您可以得到如下警告
<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>>类型。
发布于 2021-06-17 10:19:33
在我看来,你问的是两个不同的独立问题。
对于这个问题,答案很简单:这是decltype()的一项工作,允许
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>> );C++提供了一个操作符typeid(),它返回类std::type_info的一个对象,其中包括返回类型的C样式字符串描述的name()方法。
所以你可以写
std::pair x{1, 2.0};
std::cout << typeid(x).name() << '\n';不幸的是,描述字符串是特定于实现的,对于非平凡的类型来说,它并不真正描述人类。
例如,从该代码中,我获得了
St4pairIidE
来自g++和
NSt3__14pairIidEE
来自clang++。
显然,如果您对为std::pair推导的模板参数感兴趣,您可以推断出单个类型(int和double)并打印它们。
例如,您可以编写如下函数
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呼叫它
std::pair x{1, 2.0};
print_pair_types(x);从g++和clang++获得
第一对类型:i第二对类型: d
发布于 2021-12-13 10:45:10
到目前为止,我发现在编译时打印导出的任何类型的最快速和最简单的方法是将其除以nullptr。
#include <tuple>
int main() {
auto a = std::make_tuple(0, 10ul, +[](int&&) -> int { return 42; });
a / nullptr;
}GCC的产出如下:
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')https://stackoverflow.com/questions/68010592
复制相似问题