Условный условный реф

У меня есть CRTP-подобная иерархия, где производные классы могут быть реализованы немного по-разному, и для одного класса некоторые методы могут вызывать ссылки на rvalue, но для другого класса это было бы нежелательно:

template <class TDerived>
struct Base {
    TDerived& foo() {
        // Body
        return static_cast<TDerived&>(*this);
    }
};

struct Derived1: public Base<Derived1> {};
struct Derived2: public Base<Derived2> {};

int main() {
    // Should not compile:
    // Derived1().foo();

    // Should compile:
    Derived2().foo();
    return 0;
}

Так что запретить звонить foo() к ссылкам rvalue можно добавить ref-qualifier следующим образом:

TDerived& foo() & {...}

Но мне интересно, есть ли простой способ добавить такой ref-квалификатор условно, не дублируя foo() метод (и добавление немного SFINAE-подобного кода)?

0 ответов

Другие вопросы по тегам