【发布时间】:2022-01-09 07:10:13
【问题描述】:
我想知道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>; } 这样的模板参数。
在这种情况下,{ { func() } -> std::same_as<bool>; } 会被转换为std::same_as<magic_return_type, bool>,这是一种魔法吗?
【问题讨论】:
标签: c++ c++20 c++-concepts