是否可以使用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