在我看来,您问的是两个不同且独立的问题。
- 给定一个从 CTAD 获得的对象,如何获得该对象的推导确切类型。
对于这个问题,答案很简单:这是 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,其中包括一个name() 方法,该方法返回该类型的C 样式字符串描述。
所以你可以写
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++ 获得
First pair type: i
Second pair type: d