可变参数函数模板中的:: std :: pair

时间:2014-04-28 18:56:10

标签: c++ c++11

是否可以编写可变参数函数模板,接受::std::pair,而无需手动构建对:

void print_pairs()
{
}

template <typename ...B>
void print_pairs(::std::pair<int, int> const& a, B&&... b)
{
  ::std::cout << a.first << " " << a.second << ::std::endl;

  print_pairs(::std::forward<B>(b)...);
}

但我希望能够写print_pairs({1, 1}, {2, 2});,而不必一直使用::std::make_pair

编辑:

经过一番思考,最好的解决方案可能是旧学校:

print_pairs(::std::pair<int, int> const&);
print_pairs(::std::pair<int, int> const&, ::std::pair<int, int> const&);
print_pairs(::std::pair<int, int> const&, ::std::pair<int, int> const&, ::std::pair<int, int> const&);

依旧......

2 个答案:

答案 0 :(得分:8)

如果您只想每行打印两个数字,为​​什么还要费心构建std::pair

void print_pairs()
{
}

template <typename T, typename U, typename... Rest>
void print_pairs(const T& a, const U& b, const Rest&... rest)
{
    std::cout << a << " " << b << '\n';
    print_pairs(rest...);
}

int main()
{
    print_pairs(1, 1,  2, 2);
}

如果你真的需要配对,只需在功能模板中创建它们:

template <typename T, typename U, typename... Rest>
void print_pairs(T&& a, U&& b, Rest&&... rest)
{
    auto p = std::make_pair(std::forward<T>(a), std::forward<U>(b));
    // ...
    print_pairs(std::forward<Rest>(rest)...);
}

答案 1 :(得分:0)

感谢jrok,这是另一个解决方案:

template <int a, int b>
struct cpair
{
  static constexpr auto const first = a;
  static constexpr auto const second = b;
};

template <typename ...A>
void print_pairs()
{
  ::std::initializer_list<int>{(::std::cout << A::first << " " << A::second, 0)...};
}

这应该没有太多开销。