C++概念到类型trait

dm7nw8vv  于 2023-04-01  发布在  其他
关注(0)|答案(2)|浏览(87)

我有一个概念如下:

template<class T>
concept Reader = requires(T a)
{...};

我想有一个类型trait来检查一个类是否符合Reader概念-类似于is_reader<myclass>::value我如何实现这一点?
到目前为止,我的尝试是这样的:

template<typename T>
struct is_reader : std::false_type;

template<Reader T>
struct is_reader : std::true_type;

由于重新声明了模板类型,因此无法编译。
我也试过:

template<typename T>
struct is_reader : std::false_type;

template<>
struct is_reader<Reader auto> : std::true_type;

虽然这编译,它不工作。
如何使这个工作?为什么我的第二次尝试不工作-它在做什么?

wnavrhmk

wnavrhmk1#

正确的方法是

template<class T>
concept Reader = requires(T a) {...};

template<typename T>
struct is_reader : std::false_type {};

template<Reader T>
struct is_reader<T> : std::true_type {};
vnzz0bqm

vnzz0bqm2#

概念可以直接计算为布尔表达式:

#include <concepts>

static_assert(std::signed_integral<int>);
static_assert(!std::signed_integral<unsigned>);

Live demo (godbolt)
所以你可以去掉SFINAE,简单地写:

#include <type_traits>

template<typename T>
struct is_reader : std::bool_constant<Reader<T>> {};

Live demo (godbolt)

相关问题