C++ 概念相当于 std::decay?

gla*_*des 2 c++ c++-concepts c++20

我对概念很陌生。据我了解,概念库列出了所有可用的标准概念。然而似乎没有什么像 std::decay 那样的东西?比较以下一般用例,我想将方法​​的输入限制为类专业化类型:

演示

#include <type_traits>
#include <concepts>

template <typename T>
struct some_struct
{
    template <typename U, typename = std::enable_if_t<std::is_same_v<std::decay_t<U>, T>>>
    void do_something(U obj) {
        return ;
    }
};

int main()
{
    some_struct<int> obj;

    obj.do_something(0);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能用概念来实现这一目标?

Bar*_*rry 6

您可以添加一个概念,例如:

template <typename U, typename T>
concept DecaysTo = std::same_as<std::decay_t<U>, T>;
Run Code Online (Sandbox Code Playgroud)

这将允许:

template <DecaysTo<T> U>
void do_something(U&&);
Run Code Online (Sandbox Code Playgroud)

请注意,这仅在使用转发引用时才真正有意义。在原始示例中,参数类型为Ustd::decay_t<U>只是U,因此DecaysTo<T>简化为std::same_as<T>。它仍然是正确的,只是不必要地参与。

  • *“`std::decay_t&lt;U&gt;` 只是 `U`”*。只有当我们让演绎发生时,才可以进行像 `obj.do_something&lt;int&amp;&gt;(i);` 这样的调用;-) (3认同)