2017-03-15 50 views
0

我有一個模板類5模板參數看起來類似於這個。c + +模板與typedef多個參數?

SomeClass.h

template < typename A, typename B, typename C, typename D > 
class SomeClass 
{ 
private: 
A a_obj; 
B b_obj; 
C c_obj; 
D d_obj; 
public: 
void someoperationA(); 
void someoperationB(); 
void someoperationC(); 
}; 

SomeClass.cpp

template < typename A, typename B, typename C, typename D > 
SomeClass<A, B, C, D>::someoperationA() 
{ 
A::someStaticMethods(); 
} 

template < typename A, typename B, typename C, typename D > 
SomeClass<A, B, C, D>::someoperationB() 
{} 

template < typename A, typename B, typename C, typename D > 
SomeClass<A, B, C, D>::someoperationC() 
{} 

考慮在我的模板參數應給予像

SomeClass.cpp

template < 
typename ABIGCLASSNAME, 
typename BBIGCLASSNAME, 
typename CBIGCLASSNAME, 
typename DBIGCLASSNAME 
> 
SomeClass<ABIGCLASSNAME, 
BBIGCLASSNAME, 
CBIGCLASSNAME, 
DBIGCLASSNAME>::someoperationA() 
{ 
ABIGCLASSNAME::someStaticMethods(); 
} 
一些好的大牌的情況下

這肯定開始面色難看:(

所以是有可能的typedef模板參數以任何方式,使其可讀...像

typedef template < typename ABIGCLASSNAME, typename BBIGCLASSNAME, typename CBIGCLASSNAME, typename DBIGCLASSNAME > TEMP_WITH_PARAMS 

和東西simliar該類比其他#define

回答

2

考慮創建一個包裝struct包含所有你需要的參數,並在該模板化SomeClass

template < typename A, typename B, typename C, typename D > 
struct Settings 
{ 
    using AType = A; 
    using BType = B; 
    using CType = C; 
    using DType = D; 
}; 

template < typename TSettings > 
class SomeClass { /* ... */ } 

template < typename TSettings > 
SomeClass<TSettings>::someoperationB() { /* ... */ } 

優點:

  • 更少的樣板。

  • 如果您決定添加新模板參數或更改現有模板參數,則只需更改Settings

保留原來的界面也是微不足道了型特徵

template < typename A, typename B, typename C, typename D > 
using SomeClass = SomeClassImpl<Settings<A, B, C, D>>; 

考慮使用可變參數類型特徵避免重複A, B, C, D

template < typename... Ts > 
using SomeClass = SomeClassImpl<Settings<Ts...>>; 
+1

我應該學會不給這樣的明確的「沒有沒有」的答案。 :)。我喜歡你的解決方案。 – bolov

+0

** + 1 **或者,可能只需使用'template SomeClassImpl {...};'和'使用LongNameA = typename std :: tuple_element <0,std :: tuple > :type;'內部到upack。 – lapk

2

不,不存在

請注意,源代碼(.cpp)文件中不能有模板化的定義。請參閱Why can templates only be implemented in the header file?

有人建議定義一個類名稱空間,其中所有的定義都被認爲是該類的成員,這可以解決您的問題,但並沒有太大的吸引力。

所以要麼寫所有的模板參數(但在標題),或在類中定義它們。我個人更喜歡在類中定義方法,因爲我必須在頭文件中定義然後在頭文件中定義,但是在類的外面定義它們和在代碼中寫兩次的麻煩沒有多大好處。

你可以做的另一個竅門是擁有真正簡短的模板參數名稱並且在類中具有全名別名。例如: -

template <class F> struct S { 
    using Function = F; 
}; 
0

描述模板參數的名字很好。但是一旦你最初指定了它們,你就不必拖動它們。兩件事可以幫助你:

  1. using在類中有一個短的別名。
  2. 事實上,您不必爲類外部的定義使用模板參數的同名。

    #include <iostream> 
    template <typename SomeLongAndUglyName> 
    class ImPretty { 
        public: 
        using SimplyUgly = SomeLongAndUglyName; 
    
        void foo(); 
    }; 
    
    template <typename Ugly> 
    void ImPretty<Ugly>::foo() { 
        std::cout << "pretty" << std::endl; 
    }