我具有类似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限定符,而无需复制foo()
方法(并添加一些类似于SFINAE的代码)?