1. 程式人生 > >C++11 —— 判斷 tuple 中是否包含某個資料型別

C++11 —— 判斷 tuple 中是否包含某個資料型別

  如標題所提到的,這個問題也讓我煩惱了一會,前兩天在某個論壇上(現在找不到出處了)看到有如下程式碼的解決辦法,非常巧妙,在此整理並記錄出來做備忘。

#include <type_traits>
#include <tuple>
#include <iostream>

/**
 * @struct X_check
 * @brief  協助 X_tuple_has_type() 進行型別檢查。
 */
template< bool... >
struct X_type_check
{

};

/**
 * @brief 判斷 tuple 物件內是否包含某個資料型別。
 * 
 * @param[in ] _Fy    : 待判斷的資料型別。
 * @param[in ] _Ty... : tuple 的引數列表。
 * 
 */
template< typename _Fy, typename... _Ty >
constexpr bool X_tuple_has_type(const std::tuple< _Ty... > &)
{
    return !std::is_same< X_type_check< false, std::is_same< _Fy, _Ty >::value... >,
                          X_type_check< std::is_same< _Fy, _Ty >::value..., false > >::value;
}

int main(int argc, char * argv[])
{
    std::cout << std::boolalpha;
    std::cout << X_tuple_has_type< int    >(std::tuple< int, char, double >{ 100, 'a', 3.1415926 }) << std::endl;
    std::cout << X_tuple_has_type< char   >(std::tuple< int, char, double >{ 100, 'a', 3.1415926 }) << std::endl;
    std::cout << X_tuple_has_type< double >(std::tuple< int, char, double >{ 100, 'a', 3.1415926 }) << std::endl;
    std::cout << X_tuple_has_type< float  >(std::tuple< int, char, double >{ 100, 'a', 3.1415926 }) << std::endl;
    std::cout << X_tuple_has_type< void   >(std::tuple< int, char, double >{ 100, 'a', 3.1415926 }) << std::endl;

    return 0;
}