2

#include <vector>
#include <cassert>

template <typename Cont, typename... Rest>
void f(Cont& c, Rest&... rest)
{
    assert(c.size() == ???);
}


int main()
{
    std::vector<int> v1(10);
    std::vector<int> v2(10);
    std::vector<int> v3(10);
    std::vector<int> v4(10);

    f(v1, v2, v3, v4);
}

関数に渡されるすべてのコンテナーが同じサイズであることを確認したいと思います。ただし、この関数は、同じタイプの任意の数のコンテナーを受け取る可変個引数テンプレートです。これは可能ですか?

4

4 に答える 4

7
#include <vector>
#include <cassert>

template <typename Size>
bool check_size(Size) {
  return true;
}

template <typename Size, typename Cont, typename... Rest>
bool check_size(Size expected, Cont& c, Rest&... rest) {
  return (c.size() == expected && check_size(expected, rest...));
}

template <typename Cont, typename... Rest>
void f(Cont& c, Rest&... rest)
{
  assert(check_size(c.size(), rest...));
}

int main()
{
    std::vector<int> v1(10);
    std::vector<int> v2(10);
    std::vector<int> v3(10);
    std::vector<int> v4(10);

    f(v1, v2, v3, v4);
}
于 2012-07-18T21:45:43.743 に答える
0

標準のパラダイムは、「最初の残りの部分」のテンプレートです。したがって、最初の引数(size()メンバーを持つコンテナー)と「rest」引数(可変個引数部分)を取り、有効なレストリスト内の要素の数または数のいずれかを返すvalidatetemplate関数を宣言します。エラー時にそのセットの外(例:-1)。別のvalidate()テンプレートは、引数を1つだけ取り、restに単一の要素がある場合に選択されます。要素のサイズを返すだけです。

しかし...そうだね。ここでの目標は何ですか?

于 2012-07-18T21:42:23.523 に答える
0

「通常の」パターンを使用できますが、2 つの名前付き引数があります。

template <typename ...Args> bool AllTheSame(Args &&...) { return true; }

template <typename A, typename B, typename ...Rest>
bool AllTheSame(A && a, B && b, Rest &&... rest)
{
    return a.size() == b.size() &&
           AllTheSame(std::forward<B>(b), std::forward<Rest>(rest)...);
}
于 2012-07-18T22:12:01.223 に答える
0

このようなことを行う必要があります(チェックしていませんでした。手元にコンパイラがありません)

template <typename Cont, typename... Rest>
void assertAllOfSize(int size, Cont& first, Rest&... rest)
{
    assert(first.size() == size);
    assertAllOfSize(size, rest...);
}

template <typename Cont, typename... Rest>
void assertAllEqualSize(Cont& first, Rest&... rest)
{
    assertAllOfSize(first.size(), rest...);
}

template <typename Cont> // terminate recursion
void assertAllOfSize(int size, Cont& first)
{
    assert(first.size() == size);
}
于 2012-07-18T21:44:10.127 に答える