C++ 如何为模板类的专用版本添加成员变量?

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 <<

我有一个模板类,对于所有类型的模板参数,至少95%的代码是相同的,除非一个专门化需要添加一个成员变量和一个函数

我想得到的样本如下:

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你可以像我在回答中所做的那样,将通用代码分解成基类。