概念返回类型需求语法2对1模板参数

2022-05-16 00:00:00 c++ c++20 c++-concepts

我想知道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>;

让我纳闷的是,在这种情况下,我看到了两个模板参数TU,而我们只需要编写一个类似{ { 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))

相关文章