C++11 —— 判斷 tuple 中是否包含某個資料型別
阿新 • • 發佈:2018-12-16
如標題所提到的,這個問題也讓我煩惱了一會,前兩天在某個論壇上(現在找不到出處了)看到有如下程式碼的解決辦法,非常巧妙,在此整理並記錄出來做備忘。
#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; }