通过模板专门化,可以编写采用类型列表的特征,对返回布尔值的每个类型应用转换,然后对and
所有转换结果计算最终表达式:
#include <type_traits>
template<template<typename> class TRANSFO, typename ...ARGS>
struct Eval {};
template<template<typename> class TRANSFO, typename T, typename ...ARGS>
struct Eval<TRANSFO, T, ARGS...>
{
static constexpr bool value = TRANSFO<T>::value and Eval<TRANSFO,ARGS...>::value;
};
template<template<typename> class TRANSFO>
struct Eval<TRANSFO>
{
static constexpr bool value = true;
};
int main()
{
static_assert (Eval<std::is_integral,int,long>::value == true);
static_assert (Eval<std::is_integral,int,float,long>::value == false);
static_assert (Eval<std::is_integral,float>::value == false);
}
疑问已经std
有这样的事情了吗?或者是否可以用 中存在的特征来编写它std
?
没有什么完全像这样,但
type_traits
标头确实可以使用std::conjunction
.在Compiler Explorer上实时查看。