是否可以使用SFINAE和std::enable_if
來禁用模板類的單個成員函數?使用SFINAE禁用模板類成員函數
目前,我有一個類似的代碼:
#include <type_traits>
#include <iostream>
#include <cassert>
#include <string>
class Base {
public:
virtual int f() { return 0; }
};
template<typename T>
class Derived : public Base {
private:
T getValue_() { return T(); }
public:
int f() override {
assert((std::is_same<T, int>::value));
T val = getValue_();
//return val; --> not possible if T not convertible to int
return *reinterpret_cast<int*>(&val);
}
};
template<typename T>
class MoreDerived : public Derived<T> {
public:
int f() override { return 2; }
};
int main() {
Derived<int> i;
MoreDerived<std::string> f;
std::cout << f.f() << " " << i.f() << std::endl;
}
理想的情況下,應Derived<T>::f()
如果T != int
被禁用。由於f
是虛擬的,因此即使從未調用過Derived
的實例,也會生成Derived<T>::f()
。 但是,代碼的使用方式使得Derived<T>
(與T != int
)不會僅作爲MoreDerived<T>
的基類創建。
所以在編譯Derived<T>::f()
時需要進行編譯; reinterpret_cast
行永遠不會被執行。
什麼模板專業化的詮釋? – wasthishelpful