C++元编程:tuple类型检查contains函数编译错误排查
解决类型元组存在性检查中的std::conditional编译错误
嘿,我来帮你梳理下这个问题:你遇到的编译错误根源在于对std::conditional的使用方式理解有误。
错误原因拆解
std::conditional是一个元函数模板,它的作用是根据布尔条件从两个类型中选择一个,但它本身并不是一个带有value成员的布尔特性(trait)。它的实例化结果是一个结构体,里面的type成员才是我们真正需要继承的目标类型——要么是std::true_type,要么是递归的type_set_contains特化版本。你之前的代码直接继承std::conditional,导致type_set_contains结构体的基类是std::conditional,而这个基类并没有value成员,所以编译器报错找不到value。
修正后的代码
只需要在继承时添加typename关键字和::type,来获取std::conditional选择后的目标类型:
#include <type_traits> template <typename... Types> class type_set {}; template<typename Type, typename Tuple> struct type_set_contains: public std::false_type{}; template<typename Type, typename Head, typename... Rest> struct type_set_contains<Type, type_set<Head, Rest...>> : public typename std::conditional< std::is_same<Type, Head>::value, std::true_type, type_set_contains<Type, type_set<Rest...>> >::type {}; // 关键修正:使用typename和::type获取实际要继承的类型 template<typename Type, typename Tuple> constexpr bool type_set_contains_v = type_set_contains<Type, Tuple>::value;
修正逻辑说明
- 当
std::is_same<Type, Head>::value为true时,std::conditional的type成员是std::true_type,我们继承它后,type_set_contains就会拥有value = true; - 当条件为
false时,std::conditional的type成员是递归实例化的type_set_contains<Type, type_set<Rest...>>,继续检查剩余的类型; - 当遍历完所有类型都没匹配时,会匹配到最基础的特化版本(继承
std::false_type),此时value = false。
测试验证
你可以用以下代码测试修正后的逻辑:
#include <iostream> int main() { // 输出1(float存在于type_set中) std::cout << type_set_contains_v<float, type_set<int, float, double>> << "\n"; // 输出0(char不存在于type_set中) std::cout << type_set_contains_v<char, type_set<int, float, double>> << "\n"; return 0; }
内容的提问来源于stack exchange,提问作者Harald
相关产品推荐
相关产品推荐

