目前,我正在学习C++中的元编程,并且正在尝试查看元组的一个元素是否是一个指针。我试过这种方法:
int a = 3, b = 4;
auto tup = std::make_tuple(&a, b);
std::cout << std::is_pointer<decltype(std::get<0>(tup))>::value; //prints 0我觉得这很奇怪,所以我检查了clang推断的类型(我使用clang-10),
__tuple_element_t<0UL, tuple<int *, int>看上去像是某种内部类型。
为什么我会得到这种奇怪的类型,如何才能得到元组的实际类型呢?我只有一个使用中间auto变量的解决方案,但不是最优的。
发布于 2020-10-11 07:29:01
std::is_same/std::is_same_v在TMP中非常有用,当寻找与其他类型相等的类型时,当与static_assert一起使用时,它是非常宝贵的。
使用下面的代码,您可以看到std::get为您提供了对元组元素的引用(如cppreference's page on std::get所确认的),在本例中是int*&,其中int*是元素的类型。如果使用它初始化另一个变量,就会得到它的副本(因此不再引用elem,只引用int*),就像int x = r;将x定义为r的副本一样,而不管r是引用还是非引用。
#include <type_traits>
#include <tuple>
int main() {
int a = 3, b = 4;
auto tup = std::make_tuple(&a, b);
auto elem = std::get<0>(tup);
static_assert(std::is_same_v<decltype(elem), int*>,"");
static_assert(std::is_same_v<decltype(std::get<0>(tup)), int*&>,"");
}关于您的尝试,上面的第二个static_assert正在传递,这说明了为什么std::is_pointer<decltype(std::get<0>(tup))>::value打印false/0:这是对int*的引用,而不是int*。另一方面,下面的内容会打印true/1
std::cout << std::is_pointer_v<std::remove_reference_t<decltype(std::get<0>(tup))>>;看到我使用了is_pointer_v而不是is_pointer和is_same_v而不是is_same吗?使用_v的是辅助元功能,它为您提供了非_v元功能的value成员。remove_reference_t对remove_reference的工作方式类似,但给出了type成员。
发布于 2020-10-11 07:53:27
作为Enrico explained,您得到的类型是一个参考。除了他的回答,我想说,您可以更容易地获得元组元素的实际类型:
std::tuple_element_t<0, decltype(tup)>https://stackoverflow.com/questions/64301561
复制相似问题