通过模板专门化,可以编写采用类型列表的特征,对返回布尔值的每个类型应用转换,然后对所有转换结果计算最终表达式,即
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
中存在的特征来编写它?
问题
已经有这样的东西了吗?或者是否可以用std
中存在的特征来编写它?std
没有什么完全像这样,但是
type_traits
标头确实可以使用 std::conjunction
删除样板。
template<template<typename> class TRANSFO, typename ...ARGS>
using Eval = std::conjunction<TRANSFO<ARGS>...>;