2014-04-17 35 views
1

我在C++高度模板代碼和代碼工作是推動我瘋了,因爲我經常要惹這樣的可憎各地:C++如何使模板代碼更加清晰

std::pair<typename P<A, B>::const iterator, std::pair<long, typename P<A, B>::const_iterator> p; 

(沒有C++ 11元組)

這:

template <A, B, C, D, E> 
class MyClass { 
    private: 
    P <A, B> p; 
    Q <C, D> q; 
    // (does nothing with A, B, C, D but has to use the template because 
    // this class uses other templated classes P<A, B> and Q<C, D>) 
    // ... 
}; 

有沒有一種方法,使代碼更清潔,更具有可讀性喜歡使用typedef或其他的技巧?

編輯: 認爲P和Q爲std :: maps,我不知道類型。

這裏是〜我的代碼是如何工作的

template<A, B, C, D> 
class MapWrapper { 
    private: 
    std::map< map<A, B>::const_iterator, map<C, D>::const_iterator > _map; 

    public: 
    void insert_in_map (map<A, B>::const_iterator one, map<C, D>::const_iterator two) { 
     _map[one] = two; 
    } 
}; 
+5

是的,用'typedef'或'using'。但你已經說過,在這個問題上,所以我不確定你在找什麼...... –

+0

我如何使用typedef來減少模板?我不能使用,因爲模板的一個副作用是我必須把所有代碼放在.h –

+1

您的問題中的長表達式std :: pair <...'是無效的... – Danvil

回答

2

一種選擇就是把它重寫

template <class P, class Q> 
class MyClass { 
    private: 
    P p; 
    Q q; 
}; 

,而是使用類似

MyClass<A, B, C, D, E> 

他們改變

MyClass<P<A, B>, Q<C, D>> 

這樣,正確使用typedefs,可能減少樣板量。

另一種選擇是通過應用某種類型的擦除(即使用較少的模板)來支付運行時性能。

編輯:下你的編輯,在具體的代碼,你可以概括你的類與任何對迭代器的工作:

template<class I1, class I2> 
class MapWrapper { 
    private: 
    std::map<I1, I2> _map; 

    public: 
    void insert_in_map (I1 one, I2 two) { 
     _map[one] = two; 
    } 
}; 

根據不同的算法部分,這可能會或可能不會,合理。

+0

可以隨時添加另一個「模板類MyOtherClass」,它是MyClass 的同義詞,Q >'。 – Sjoerd

+0

但是,我只是將模板責任轉移給使用我的代碼的人。 –

+0

現在我想起來了,模板化這個類並不是模板化後的東西。 –