我有一个概念如下:
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;
虽然这编译,它不工作。
如何使这个工作?为什么我的第二次尝试不工作-它在做什么?
2条答案
按热度按时间wnavrhmk1#
正确的方法是
vnzz0bqm2#
概念可以直接计算为布尔表达式:
Live demo (godbolt)
所以你可以去掉SFINAE,简单地写:
Live demo (godbolt)