【问题标题】:concepts return type requirement syntax two versus one template parm概念返回类型要求语法二对一模板参数
【发布时间】: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>;

让我感到奇怪的是,在这种情况下,我看到了两个模板参数 TU,而我们只需要编写一个像 { { func() } -&gt; std::same_as&lt;bool&gt;; } 这样的模板参数。

在这种情况下,{ { func() } -&gt; std::same_as&lt;bool&gt;; } 会被转换为std::same_as&lt;magic_return_type, bool&gt;,这是一种魔法吗?

【问题讨论】:

    标签: c++ c++20 c++-concepts


    【解决方案1】:

    concept 通常类似于constexpr inline bool 变量模板。但是,它确实具有特殊属性。关于这个问题,concept 的第一个模板参数是类型是一种特殊的概念:“类型概念”。

    在某些地方,可以在没有第一个模板参数的情况下使用类型概念。在这些地方,第一个参数将根据它的使用方式推导出来。

    requires 表达式的复合需求中,类型概念是-&gt; 之后的内容。 The first parameter of the concept will be filled in by the type of the expression E in the {}, as if by decltype((E)).

    【讨论】:

    • 您能否也提示一下在哪里可以找到“将填充概念的第一个参数......”?谢谢!
    • @Klaus:我不知道您所说的“在哪里可以找到”是什么意思?比如,在 C++ 标准中?
    • 也许暗示了 c++ 标准中的段落或 cppreference.com 上的某些内容?明天我自己试试看。
    • @Klaus:我提供了标准的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2022-01-22
    • 2023-03-08
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多