我试图检查特定类型是否属于类型列表(元组)。并遇到了一些麻烦:
while
似乎#include <tuple>
#include <iostream>
template < typename T >
struct Type {
using type = T;
};
int main() {
constexpr auto Foo = std::make_tuple(Type<int>{},Type<int>{});
if (std::is_same<int, std::get<0>(Foo)::type>::value)
std::cout << "GG!" << std::endl;
return 0;
}
test.cpp: In function ‘int main()’:
test.cpp:13:47: error: type/value mismatch at argument 2 in template parameter list for ‘template<class, class> struct std::is_same’
if (std::is_same<int, std::get<0>(Foo)::type>::value)
^
test.cpp:13:47: note: expected a type, got ‘std::get<0ul, {Type<int>, Type<int>}>(Foo)’
似乎没有向我显示我想要的类型。有人能解释我为什么吗?
答案 0 :(得分:1)
std::get<0>(Foo)::type
在这种情况下没有任何意义,因为std::get<0>(Foo)
是一个值,而不是一个类型。
请尝试这样做:我们将使用decltype()
来获取该表达式的类型(而不实际评估其值)。这将导致Type<int>&
类型。我们将使用std::decay
删除引用(因为Type<int>&::type
也没有意义),然后我们可以访问其type
typedef。
它有点笨拙,但它有效:
if (
std::is_same<
int,
// The decltype will be (Type<int>&). Decay to remove the
// reference, cv-qualifiers, etc.
std::decay<
decltype(std::get<0>(Foo))
>::type::type
// ^ Two ::types, one to extract the type from std::decay, one
// for your Type<T> struct.
>::value
) {
std::cout << "GG!" << std::endl;
}
(Demo)
当然可以有更好的方法来完成这项检查,但这只是一种方式。