Условный условный реф
У меня есть 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-подобного кода)?