std 是否拥有可转换类型列表并将每个转换值聚合为单个表达式的类型特征?

问题描述 投票:0回答:1

通过模板专门化,可以编写采用类型列表的特征,对返回布尔值的每个类型应用转换,然后对所有转换结果计算最终表达式,即

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
中存在的特征来编写它?

c++ templates std type-traits
1个回答
0
投票

问题

std
已经有这样的东西了吗?或者是否可以用
std
中存在的特征来编写它?

没有什么完全像这样,但是

type_traits
标头确实可以使用
std::conjunction
删除样板。

template<template<typename> class TRANSFO, typename ...ARGS>
using Eval = std::conjunction<TRANSFO<ARGS>...>;
© www.soinside.com 2019 - 2024. All rights reserved.