2013-03-14 26 views

Trả lời

42

này nên làm việc:

template<std::size_t N, typename... T> 
using static_switch = typename std::tuple_element<N, std::tuple<T...> >::type; 

Một phương pháp:

template<std::size_t N, typename T, typename... Ts> 
struct static_switch { 
    using type = typename static_switch<N - 1, Ts...>::type; 
}; 
template<typename T, typename... Ts> 
struct static_switch<0, T, Ts...> { 
    using type = T; 
}; 
+1

+1 xuất sắc trả lời . Tôi luôn quan tâm đến những cách mới để sử dụng các mẫu variadic. Cảm ơn người khác. – WhozCraig

+0

+1 Tôi không biết bạn có thể có một 'sử dụng' được tạo khuôn mẫu. –

+1

@AlexChamberlain không phải tất cả trình biên dịch đều hỗ trợ nó (nó họ làm, đó là phiên bản mới nhất của họ) –

10

Bạn có thể sử dụng một boost::mpl::vector để lưu trữ các loại của bạn và sử dụng boost::mpl::at<v,n>::type để có được một loại với từ chỉ số.

template<std::size_t N, typename... T> 
using static_switch = typename boost::mpl::at<boost::mpl::vector<T...>, N>::type; 
8

Làm thế nào về

template<size_t N, typename T, typename U> 
struct static_switch {}; 

template<typename T, typename U> 
struct static_switch<0, T, U>{typedef T type;}; 

template<typename T, typename U> 
struct static_switch<1, T, U>{typedef U type;}; 

Bạn sẽ sử dụng nó như sau:

using type_0 = static_switch<0,T,U>::type; // yields type T 
using type_1 = static_switch<1,T,U>::type; // yields type U 

này được nhiều hay ít thực hiện cho bạn trong std::conditional.

+8

Lưu ý: 'std :: conditional' là tuyệt vời nếu chỉ có 2 lựa chọn thay thế. Vì OP đang nói về một chỉ mục, có thể có nhiều hơn. –

1

Với C++ 17, bạn cũng có thể thực hiện theo cách khác. Thay vì tính toán các loại một cách rõ ràng, bạn có thể sử dụng constexpr if và làm những việc khác nhau (bao gồm cả trở về các loại khác nhau) trực tiếp:

template<size_t N> 
decltype(auto) foo(){ 
    if constexpr(N%2==0){ 
     return std::string("Hello I'm even"); 
    }else{ 
     return std::pair(
      std::vector<char>{'O','d','d',' ','v','a','l','u','e'}, 
      [](){ return N; });   
    } 
} 

foo<0>()   // "Hello I'm even" 
foo<21>().second() // 21 

Bạn cũng có thể sử dụng để nhận được chỉ là loại:

using type_0 = decltype(foo<0>()); 
using type_1 = decltype(foo<1>()); 
Các vấn đề liên quan