假设我有一个具有很多功能的模板类,并且我想专门针对它们进行更改,以仅更改其中一些功能,并使其他功能完全与基本模板类中指定的功能相同。
我怎样才能做到这一点?
以下是我想要实现的目标,但是解决方案不好,因为它不允许我将int
的特化称为Base<int>
–我需要为此使用IntSpec
。
#include <iostream>
using namespace std;
template<typename T>
struct Base
{
void print1() {cout << "Base::print1" << endl;};
void print2() {cout << "Base::print2" << endl;};
};
struct IntSpec : public Base<int>
{
void print2() {cout << "Base<int>::print2()" << endl;};
};
int main()
{
Base<double> d;
// Base<int> i; <-- I want this kind of instantiation
IntSpec i;
d.print1();
d.print2();
i.print1();
i.print2();
}
输出为:
Base::print1
Base::print2
Base::print1
Base<int>::print2()
最佳答案
Nicol的解决方案工作正常,但这是一种替代方法:
template<typename T>
struct Base
{
void print1() {cout << "Base::print1" << endl;};
void print2() {cout << "Base::print2" << endl;};
};
template<>
void Base<int>::print2() {cout << "Base<int>::print2()" << endl;};
这样,您可以只专门化特定的成员函数,并且仍然可以使用那些尚未专门化的成员函数(在本例中为
print1
)没有任何问题。因此,现在您可以按需要使用它:Base<int> i;
i.print1();
i.print2(); // calls your specialization
演示here。
关于c++ - 模板专门化和继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17056579/