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”参数(可变参数部分),并返回一个有效的 rest 列表中的元素数或一个数字在该集合之外(例如-1)出错。一个单独的 validate() 模板将只接受一个参数,并且在 rest 具有单个元素的情况下被选中;它只会返回元素的大小。

但是……哎呀。这里的目标是什么?

于 2012-07-18T21:42:23.523 回答
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 回答
0

您可以使用“常规”模式,但有两个命名参数:

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 回答