2016-07-18 8 views
0

これはVector of pairs with generic vector and pair type, template of templateのフォローアップです。stxx :: vector for std :: vectorの代替としてのStxxlベクター

私はstd::vectorまたはstxxl:vectorのメソッドを呼び出すことができますが、vector(x、yのペア)のテンプレート引数が指定されています。

具体的方法のsignatrueは、次のようになります。このような署名を指定するとき

template<typename t_x, typename t_y, 
      template<typename, typename> class t_pair, 
      template<typename...> class t_vector> 
    method(t_vector<t_pair<t_x,t_y>> &v) 

残念ながら、stxxl:vectort_vectorとしてを渡すことはできません。それは以下のコンパイルエラーにつながる:

sad.hpp:128:5: note: template argument deduction/substitution failed: 
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’ 
     method(coordinates); 
         ^
program.cpp:104:52: error: expected a type, got ‘4u’ 
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’ 
program.cpp:104:52: error: expected a type, got ‘2097152u’ 

質問はstd::vectorを使用してコードを既存のドロップイン置換としてstxxl::vectorを使用することができるようにするために、メソッドのシグネチャを変更する方法ですか?

ベクトルにネストされたテンプレートを使用している理由を更新してください: 私は間違っているかもしれませんが、前述の方法で変数を入力するコンパイラが必要です。

私は例えばペア要素の種類に応じて、天気をuint32_t or uint64_tのいずれかである必要がありvectorまたはqueue

std::vector<t_x> intervals(k * k + 1); 
typedef std::tuple<std::pair<t_x,t_y>,std::pair<t_x,t_y>, std::pair<t_x,t_y>, uint> t_queue; 
std::queue <t_queue> queue; 

を構築していますuint32_t or uint64_t

+0

なぜ、そのようなテンプレートパラメータを指定する必要がありますか?単純な 'typename t_vector'を他のすべてのパラメータなしで使用するのはなぜですか?このテンプレートパラメータを使用してさまざまな型を構築する場合、テンプレートテンプレートパラメータを持つことは有益ですが、あなたの場合は 't_pair'という1つの型だけを使用します。 – Holt

+0

私はペアのテンプレートパラメータとしてuint32_tとuint64_tを使用しています。私は32/64ビット整数を使うべきかどうかを私のコードでt_x/t_yを使って決めています。 –

+0

私はあなたが単純なフォームとは違うやり方でテンプレートを持っているのがなぜあなたに役立つのでしょうか?このようなテンプレートパラメータが必要な理由(なぜ、より単純なフォームがあなたのために機能しないのか)を正確に示すために質問を更新できますか? – Holt

答えて

3

問題はstxxl::vectorが非持っているということです型テンプレートパラメータ:

BlockSize external block size in bytes, default is 2 MiB

したがって、ma tchとtemplate <typename... >

あなたは(私は思う)、このようなものが良いだろう。この場合、テンプレートテンプレートパラメータを使用しないでください。

template <typename t_vector> 
void method (t_vector &v) { 
    typedef typename t_vector::value_type::first_type t_x; 
    typedef typename t_vector::value_type::second_type t_y; 
    // or in c++11 and above 
    typedef decltype(v[0].first) t_xd; 
    typedef decltype(v[0].second) t_yd; 
} 

を上記では、あなたがいずれかを使用しt_xt_yを検索:

  • value_typeこれはすべてContainerにある必要があります(std::vectorstxxl::vectorの両方です)。
  • decltypev[0].firstの式から直接型を取得します(decltype内の式は評価されないため、vが空であっても動作します)。その後、私の経験から

、非常に汎用的なテンプレート引数を使用することをお勧めしますし、そこから情報を取り出す(value_typedecltype、...)指定した種類のテンプレート引数そのものを制約しようとするよりも。

関連する問題