2017-03-23 6 views
0

は.hファイルで、私はテンプレートクラスの宣言があるとします。テンプレート別々のcppファイル内のクラスの一般的な専門:多くのテンプレート引数

template<typename T1, 
     typename T2, 
     typename T3, 
     typename T4> 
class A { 
public: 
    A(); 
    ~A(); 

    void method1(); 
    void method2(); 

    ... 
} 

このAPI がまだあるので、テンプレート引数の数が変更の対象であります未修理。私は分離された.cppファイルで一般的な専門化を実装することを好む。私は1つが(例えばctorのために)書き込むことを理解したよう:

各クラスAメソッドの
template<typename T1, 
     typename T2, 
     typename T3, 
     typename T4> 
A<T1, T2, T3, T4>::A() { 
    ... 
} 

のように...それはかさばる建設を使用するように私を悩ま:私はクラスAを実装

template<typename T1, 
     typename T2, 
     typename T3, 
     typename T4> 
A<T1, T2, T3, T4>:: 

毎回メソッド。 1つまたは複数のテンプレート引数を追加または削除する場合は大きな問題になります。 これを避けるためにC++言語機能(C++ 11まで)を使用できますか?初期の私はこれを行うためのプリプロセッサマクロを見たが、私は思う醜いです:)

+3

を使用されている方法で、変更はありません - あなたのユーザーをテンプレートはテンプレートのインスタンス化を可能にするためにこの特殊化を見る必要がありますので、この.cppでAのバージョンを明示的にインスタンス化する準備ができていない限り、この実装を.hファイルに置くこともできます。 – marcinj

+0

C++ 11のバリアントテンプレートを使用することができます。 http://eli.thegreenplace.net/2014/variadic-templates-in-c/を確認してください – Mrnell

答えて

0

多分あなたは、テンプレートの引数を保持する中間クラスを作成することができます。このようなもの。

A.h テンプレート class TemplateParams { using T1_S = T1; T2_S = T2を使用します。 T3_S = T3を使用する。 T4_S = T4を用いる ;
};

template<typename TemplateParams> 
class A_Base { 
public: 
    A_Base(); 
    ~A_Base(); 

    void method1(); 
    void method2(); 
}; 

template<typename T1, 
     typename T2, 
     typename T3, 
     typename T4> 
using A = A_Base<TemplateParams<T1,T2,T3,T4>>; 

#include "A_impl.h" 

A_impl.h

template<typename TemplateParams> 
    A_Base<TemplateParams>::A_Base() {} 

    template<typename TemplateParams> 
    A_Base<TemplateParams>::~A_Base() {} 


    template<typename TemplateParams> 
    void A_Base<TemplateParams>::method1() { 

    } 

それは `私が分離した.cpp file`で一般的な特殊化を実装することを好む

#include "A.h" 
A<int,int,int,int> a; 
a.method1(); 
関連する問題