std :: is_same和std ::聚在一起

时间:2017-03-24 21:56:42

标签: c++ tuples metaprogramming

我试图检查特定类型是否属于类型列表(元组)。并遇到了一些麻烦:

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)’ 似乎没有向我显示我想要的类型。有人能解释我为什么吗?

1 个答案:

答案 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

当然可以有更好的方法来完成这项检查,但这只是一种方式。