是否可以编写可变参数函数模板,接受::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&);
依旧......
答案 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)...};
}
这应该没有太多开销。