::std::对在可变函数模板中

::std::pair in a variadic function template

本文关键字:函数模板 std      更新时间:2023-10-16

是否可以编写一个可变函数模板,接受::std::pair s,而不必手动构建对:

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&);

等等…

如果您只想每行打印两个数字,为什么还要构建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)...);
}

感谢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)...};
}

这应该在没有太多开销的情况下工作。