这两个模板是C++17引入的类型特征组合工具,用于构建更复杂的类型判断逻辑。下面我将从技术实现到实际应用进行全面剖析:
一、基本概念与C++引入版本
1. std::disjunction_v
(逻辑OR)
- 引入版本:C++17
- 功能:对多个类型特征进行逻辑或运算
- 等价形式:
T1::value || T2::value || ... || Tn::value
- 别名模板:
disjunction_v<T...>
是disjunction<T...>::value
的简写
2. std::conjunction_v
(逻辑AND)
- 引入版本:C++17
- 功能:对多个类型特征进行逻辑与运算
- 等价形式:
T1::value && T2::value && ... && Tn::value
- 别名模板:
conjunction_v<T...>
是conjunction<T...>::value
的简写
二、底层实现原理
1. disjunction
的可能实现
template<class...> struct disjunction : std::false_type {
};
template<class B1> struct disjunction<B1> : B1 {
};
template<class B1, class... Bn>
struct disjunction<B1, Bn...> :
std::conditional_t<B1::value, B1, disjunction<Bn...>> {
};
2. conjunction
的可能实现
template<class...> struct conjunction