2016-04-06 10 views
2

私は最初のバリデーション関数テンプレートを書いています。エラーerror: parameter packs not expanded with ‘...’:が表示されます。おそらく私はここで簡単なコンセプトを理解することはできません。私は、vectoriteratorsで渡されたすべてを保存したいと思います。これを行う正しい方法は何ですか?展開されているSTLコンテナの等しい長さを確認するバリアント関数

std::vector<Iterator> vec_its {its...}; 

its

../proc.h: In function ‘bool IsEqualLength(Iterator& ...)’: 
../proc.h:32:24: error: parameter packs not expanded with ‘...’: 
    std::vector<Iterator> vec_its {its...}; 
         ^
../proc.h:32:24: note:   ‘Iterator’ 
../proc.h:35:87: error: parameter packs not expanded with ‘...’: 

答えて

4

をあなたはこの声明の中で二つの異なるパックを使用している:

template<typename... Iterator> 
bool IsEqualLength(Iterator&... its) 
{ 
    std::vector<Iterator> vec_its {its...}; 
    int head = vec_its.front().size(); 

    bool is_diff_size = std::any_of(vec_its.begin(), vec_its.end(), 
     [&head](Iterator& cur){return cur.size() != head;}); 

    if(is_diff_size) 
    { 
     return false; 
    } else { 
     return true; 
    } 
} 

は、これは(GCC 4.8.4の下でUbuntuの上)でコンパイルに失敗しますしかし、Iteratorは単一のタイプではありません...それもパックであり、あなたはそれを展開することに失敗しています。したがって、エラー(具体的にはIteratorを指摘する)。

あなたが望むすべてがコンテナのサイズであれば、あなただけのすべての渡されたコンテナ(コンテナではなく、イテレータ!)にsize()を呼び出し、配列(動的割り当てが不要)でそれを置くことができます:

template <typename... Container> 
bool isEqualLength(Container&&... cs) { 
    size_t sizes[] = {cs.size()...}; 

    return std::all_of(std::begin(sizes), std::end(sizes), 
     [&sizes](size_t cur){return cur == sizes[0]; }); 
} 
関連する問題