C++ 如何为模板类的专用版本添加成员变量?
我有一个模板类,对于所有类型的模板参数,至少95%的代码是相同的,除非一个专门化需要添加一个成员变量和一个函数 我想得到的样本如下:C++ 如何为模板类的专用版本添加成员变量?,c++,templates,template-specialization,specialization,member-variables,C++,Templates,Template Specialization,Specialization,Member Variables,我有一个模板类,对于所有类型的模板参数,至少95%的代码是相同的,除非一个专门化需要添加一个成员变量和一个函数 我想得到的样本如下: template <typename T> class AClass { private: T payLoad; public: AClass( const T& crp_payload ) : payLoad( crp_payload ) {}; void showMe() { cout <<
template <typename T>
class AClass {
private:
T payLoad;
public:
AClass( const T& crp_payload ) : payLoad( crp_payload ) {};
void showMe() {
cout << "Common showMe:" << payLoad << endl;
};
/*
* A lot of functions same for all specializations go here.
* I absolutely don't want to implement respectively them for
* every specializations!
*/
// specializing for int ----------------------------
// dedicated function
template <int>
void showPayload() {
cout << "AClass<int>::showPayload:" << payLoad << endl;
};
// dedicated variable, but following code can not be compiled!
template <int>
int otherPayload;
};
int main() {
AClass<int> iac( 123 );
iac.showMe();
iac.showPayload();//can not pass the compiling!
AClass<float> fac(456);
fac.showMe();
return 0;
};
模板
类AClass{
私人:
T有效载荷;
公众:
AClass(const T&crp_有效载荷):有效载荷(crp_有效载荷){};
void showMe(){
cout一种可能的方法是良好的旧继承:
template struct Extra{};
模板结构额外{
int外部有效载荷;
无效有效载荷();
};
模板类:公共额外{
void showMe();
};
模板无效类::showMe(){showPayload();}
所有特定于专门化的部分都在一个单独的类中提取,常用方法根据需要专门化。我认为您可以简单地对模板类进行常规专门化:
#include <iostream>
#include <iomanip>
template <typename T>
class BaseClass
{
protected:
T payLoad;
public:
BaseClass(const T& crp_payload)
: payLoad( crp_payload )
{ }
void showMe() {
std::cout << "Common showMe:" << payLoad << std::endl;
}
/*
* A lot of functions same for all specializations go here.
* I absolutely don't want to implement respectively them for
* every specializations!
*/
};
template <typename T>
class AClass
: public BaseClass<T>
{
public:
AClass( const T& crp_payload )
: BaseClass<T>(crp_payload)
{ }
};
// specializing for int ----------------------------
template<>
class AClass<int>
: public BaseClass<int>
{
public:
AClass( int crp_payload )
: BaseClass(crp_payload)
{ }
// dedicated function
void showPayload() {
std::cout << "AClass<int>::showPayload:" << payLoad << std::endl;
}
private:
int otherPayload;
};
int main() {
AClass<int> iac( 123 );
iac.showMe();
iac.showPayload();//can not pass the compiling!
AClass<float> fac(456);
fac.showMe();
return 0;
}
#包括
#包括
模板
类基类
{
受保护的:
T有效载荷;
公众:
基类(常数T和crp_有效载荷)
:有效载荷(crp_有效载荷)
{ }
void showMe(){
std::谢谢你的回答!我认为你的解决方案是目前为止最好的。事实上,我想确保只有专门“修改/补充”某个类的某些成员而不完全重新实现它是没有办法的。是吗?@Leon你可以像我在回答中所做的那样,将通用代码分解成基类。