如何用概念替换成员函数的引用限定符?

问题描述 投票:0回答:1

是否可以用概念替换以下引用限定符?

也就是说,而不是

struct S 
{
   void func() && {}
   void func() & {}
};

有这样的东西

struct S 
{
   void func() requires rvalue_concept< decltype(*this) > {}
   void func() requires lvalue_concept< decltype(*this) > {}
};
c++ constraints c++-concepts member-functions ref-qualifier
1个回答
2
投票

是否可以用概念代替引用限定符?

您可以使用c++23中引入的语法,它允许我们推断出

this
的类型。 这样,你就可以写:

template<typename T>
concept rvalue_concept = std::is_rvalue_reference_v<T&&>;

template<typename T>
concept lvalue_concept = !rvalue_concept<T>;

struct S 
{
    template<typename Self>
    void func(this Self&& self) requires rvalue_concept<Self> 
    {
        std::cout << "rvalue version called\n";
    }

    template<typename Self>
    void func(this Self&& self) requires lvalue_concept<Self> 
    {
        std::cout << "lvalue version called\n";
    }
};

观看现场演示

© www.soinside.com 2019 - 2024. All rights reserved.