2010-12-04 8 views
8

最近、私はあまり使用されていないSTLの機能の1つ、カスタムアロケータを使用していますが、私は意味のオーバーヘッドを減らすために深刻な助けが必要です。たとえば、ファイル名を1組のintと1つのshared_ptrの順序付けられていないマップにトークンにマップする順序付けられていないマップを定義しますが、カスタムのアロケータを使用します。C++でのテンプレートの複雑さの軽減

typedef std::pair<int, int> token_key_type; 
typedef std::unordered_map< 
    token_key_type, 
    std::shared_ptr<Token>, 
    std::hash<token_key_type>, 
    std::equal_to<token_key_type>, 
    Allocator< 
     std::pair< 
      const token_key_type, 
      std::shared_ptr< 
       Token 
      > 
     > 
    > 
> filename_map_value_type; 
std::unordered_map< 
    string, 
    filename_map_value_type, 
    std::hash<string>, 
    std::equal_to<string>, 
    Allocator< 
     std::pair< 
      const string, 
      filename_map_value_type 
     > 
    > 
> tokens; 

これは404文字の定義です。そして、それを構築するためには、既定で構築することができないAllocatorと定義が存在しないバケットカウントを除き、すべてのテンプレート引数にデフォルトを渡さなければなりません。こいつ。もちろん、最初のマップの値の型も同様に構築する必要があるため、挿入するたびに同じことを繰り返します。

私自身のunordered_mapを書かなくてもこれを回避できる方法はありますか?真剣に私の生産性を低下させ始めています。

編集:申し訳ありません。私は一般的にSTLコンテナのために、特にunordered_mapだけでなく、それが最悪のケースであることを意味しました。私はまた、規則的なマップ、unordered_setなどでこの問題を抱えており、私が間違いなく必要とする可能性のあるすべての可能なSTLコンテナについてこれを行う関数を書くことはできません。

+0

テンプレートのインスタンス化の一部を探しているのでしょうか? http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-08/2307.html –

答えて

6

。ファクトリ関数を追加して構築を簡単にすることもできます。

template<typename K, typename V> struct unordered_map_type 
{ 
    typedef std::unordered_map< 
     K, 
     V, 
     std::hash<K>, 
     std::equal_to<K>, 
     Allocator< 
      std::pair<const K, V> 
     > 
    > type; 
}; 

typedef std::pair<int, int> token_key_type; 
typedef unordered_map_type<token_key_type, std::shared_ptr<Token> >::type filename_map_value_type; 
+0

それ以外の場合は – diverscuba23

+0

これは私がやったことです。まだまだ冗長すぎますが、大きな改善です。ありがとう! – Puppy

6

残念ながら、ここにはC++ 0xコンパイラがないため完全なコンパイル可能なコードサンプルを提供できません。

template<class Key, class Value> 
using custom_unordered_map = std::unordered_map 
    < 
     Key, 
     Value, 
     std::hash<Key>, 
     std::equal_to<Value>, 
     Allocator<std::pair<const Key, Value>> 
    >; 

typedef custom_unordered_map<token_key_type, std::shared_ptr<Token>> filename_map_value_type; 
typedef custom_unordered_map<std::string, filename_map_value_type> your_typedef_name; 

もう一度、申し訳ありません、これはコンパイルできない場合:しかし、私はC++ 0xのtemplate aliasesはここに役立つ可能性が信じています。

はまた、これは、追加型「間接」を使用してC++ 03ですでに可能であったことに注意してください。

icecrimeのソリューションは、以下のコードを経由して、古いコンパイラでのみ少し醜さで行うことができます
template<class Key, class Value> 
struct custom_unordered_map 
{ 
    typedef std::unordered_map 
    < 
     Key, 
     Value, 
     std::hash<Key>, 
     std::equal_to<Value>, 
     Allocator<std::pair<const Key, Value> > 
    > type; 
}; 

typedef custom_unordered_map<token_key_type, std::shared_ptr<Token> >::type filename_map_value_type; 
typedef custom_unordered_map<std::string, filename_map_value_type>::type your_typedef_name; 
+0

C++ 0xが利用可能であれば、私はこれが好きです。 – diverscuba23

+0

「テンプレートエイリアス」は、私が最も待つ機能です.GCCのウェブサイトをよく見て、実装されることを期待しています。既にこの機能を実装しているコンパイラはありますか? – rafak

+0

完璧なフォワーディングでテンプレートエイリアシングをシミュレートすることはできませんか? – Ell

関連する問題