如何解决decltypestd :: get <0>tup到底是什么?
我目前正在学习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
变量的解决方案,但并不是最佳选择。
解决方法
std::is_same
/ std::is_same_v
在TMP中非常有用,当查找与其他类型相同的类型时,与static_assert
结合使用时,它是无价的。
使用以下代码,您可以看到std::get
为元组的元素提供了引用(由cppreference's page on std::get
确认),在这种情况下为int*&
,其中{{1 }}是元素的类型。如果您使用它来初始化另一个变量,则会得到它的副本(因此,int*
不再引用elem
),就像int*
定义了{ {1}}是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
的原因:这是 reference 到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
成员。 value
的工作方式与_v
类似,只是赋予了remove_reference_t
成员。
与Enrico explained一样,您获得的类型只是一个参考。 除了他的回答,我想说您可以使用以下命令更轻松地获取元组元素的实际类型:
std::tuple_element_t<0,decltype(tup)>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。