我想知道如何std::same_as
的定义以及我们如何在概念或需求中使用它。
Example:
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 https://en.cppreference.com/w/cpp/concepts/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
and U
在这种情况下,我们只需要写一个像{ { func() } -> std::same_as<bool>; }
.
是某种magic that a { { func() } -> std::same_as<bool>; }
将被转换为std::same_as<magic_return_type, bool>
在这种情况下?
A concept
一般类似于constexpr inline bool
变量模板。然而,它确实有特殊的属性。对于这个问题,一个concept
第一个模板参数是类型是一种特殊的概念:“类型概念”。
在某些位置,可以在没有第一个模板参数的情况下使用类型概念。在这些地方,第一个参数将根据它的使用方式推断出来。
在复合要求中requires
表达式,类型概念是紧随其后的->
. 概念的第一个参数将由表达式 E 中的类型填充{},仿佛通过decltype((E)) https://timsong-cpp.github.io/cppwp/n4861/expr.prim.req.compound#1.3.2.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)