概念返回类型需求语法2对1模板参数
我想知道std::same_as
是如何定义的,以及我们如何在概念或要求中使用它。
示例:
void f1() { }
bool f2() { return true; }
template < typename T>
void Do( T func )
{
if constexpr ( requires { { func() } -> std::same_as<bool>; } )
{
std::cout << "Func returns bool " << std::endl;
}
if constexpr ( requires { { func() } -> std::same_as<void>; } )
{
std::cout << "Func returns void " << std::endl;
}
}
int main()
{
Do( f1 );
Do( f2 );
}
按预期工作。
但如果我查看std::same_as的定义,我会发现一个可能的实现:
namespace detail {
template< class T, class U >
concept SameHelper = std::is_same_v<T, U>;
}
template< class T, class U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;
让我纳闷的是,在这种情况下,我看到了两个模板参数T
和U
,而我们只需要编写一个类似{ { func() } -> std::same_as<bool>; }
的参数。
在这种情况下,a{ { func() } -> std::same_as<bool>; }
将转换为std::same_as<magic_return_type, bool>
是某种魔法吗?
解决方案
Aconcept
一般类似于constexpr inline bool
变量模板。然而,它确实有特殊的性质。关于这个问题,第一个模板参数是类型的concept
是一种特殊的概念:A;类型概念。
在某些位置,可以在没有第一个模板参数的情况下使用类型概念。在这些地方,将根据第一个参数的使用方式来推断它。
在requires
表达式的复合要求中,类型概念是->
后面的。The first parameter of the concept will be filled in by the type of the expression E in the {}
, as if by decltype((E))
。
相关文章