我有类似 CRTP 的层次结构,其中派生类的实现可能略有不同,并且对于一个类,某些方法允许调用右值引用,但对于另一个类,这将是不希望的:
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()
右值引用,可以像这样添加 ref-qualifier:
TDerived& foo() & {...}
但我想知道是否有任何简单的方法可以有条件地添加这样的 ref-qualifier 而无需复制foo()
方法(并添加一些类似 SFINAE 的代码)?