2017-03-23 47 views
0

假設在.h文件中我有一個模板類聲明:模板類通用專業化獨立的CPP文件:許多模板參數

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

    void method1(); 
    void method2(); 

    ... 
} 

的模板參數的數量是受到改變,因爲這個API 仍然是不固定。我更喜歡在分離的.cpp文件中實現通用專業化。據我瞭解一個可寫(例如,用於構造函數):

template<typename T1, 
     typename T2, 
     typename T3, 
     typename T4> 
A<T1, T2, T3, T4>::A() { 
    ... 
} 

等爲每個類方法......這讓我生氣使用笨重的建設:

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

每次我實現A級方法。如果添加或刪除一個或多個模板參數 ,這將是一個大問題。 我可以使用一些C++語言功能(最高C++ 11)來避免這種情況嗎?早期我看到一個預處理器宏來做到這一點,但它是醜陋的,我認爲:)

+3

'我更喜歡以實現分離的.cpp file'通用專業化的方式沒有變化 - 的用戶您模板也必須看到這個專門化才能使模板實例化成爲可能,所以除非你準備在這個.cpp中明確地實例化A的版本,否則你也可以把這個實現放在.h文件中。 – marcinj

+0

可以使用C++ 11中的變量模板。檢查http://eli.thegreenplace.net/2014/variadic-templates-in-c/ – Mrnell

回答

0

也許你可以創建一箇中間類來容納模板參數。像這樣的東西。

A.h template 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() { 

    } 

在它被用來

#include "A.h" 
A<int,int,int,int> a; 
a.method1();