以非序列顺序传递两个 std::array 元素作为函数参数
Passing two std::array elements as function arguments in non sequence order
我想知道如何以混合顺序将两个 std::arrays 的元素作为函数参数传递。如果参数的顺序无关紧要或者它是顺序的(当一个数组的元素应该在另一个数组的元素之后传递时),这是非常简单的任务。
我们可以像这样简单地使用折叠表达式
#include <array>
template <typename ...T>
void foo_impl(const T&... Args)
{
// The function will recieve arguments like this
//
// foo_impl("one", "two", "three", 1, 2, 3);
//
}
template <size_t ...Indexes>
void foo(const std::index_sequence<Indexes...>&)
{
std::array<const char*, 3> values = {"one", "two", "three"};
std::array<int, 3> keys = {1, 2, 3};
foo_impl((values[Indexes])..., (keys[Indexes])...);
}
int main()
{
foo(std::make_index_sequence<3>{});
return 0;
}
在这种情况下,函数 foo_impl 将按以下顺序接收参数 - ("one", "two", "three", 1, 2, 3),但对我来说,按特定顺序混合它们很重要。
我无法创建第三个数组并组合参数,因为它们具有不同的类型和实际数组包含的项目可能对 copy/move 来说相当昂贵。
此外,我无法在 foo_impl 函数级别重新组合参数,因为它们的顺序对日志系统很重要。以前我为此使用了很多宏。但现在我想重构这段代码,使其更现代、更易于调试和理解。
我想知道是否可以混合那些 std::array 元素(使用折叠表达式或类似的元编程技术)并像那样传递 ("one", 1, "two ", 2, "three", 3) 在调用 foo 或 foo_impl?
之前
在此先感谢您的帮助!
P.S。抱歉我的英语不是母语。
在通过之前把它们变成一对:
#include <array>
#include <utility>
#include <iostream>
template <typename ...T>
void foo_impl(T... Args)
{
((std::cout << std::forward<T>(Args).first << " "<< std::forward<T>(Args).second << " "), ...);
// prints "1 one 2 two 3 three"
}
template <std::size_t ...Indexes>
void foo(const std::index_sequence<Indexes...>&)
{
std::array<const char*, 3> values = {"one", "two", "three"};
std::array<int, 3> keys = {1, 2, 3};
foo_impl(std::pair{keys[Indexes], values[Indexes]}...);
}
int main()
{
foo(std::make_index_sequence<3>{});
return 0;
}
你可能会
template <std::size_t ...Is>
void foo(const std::index_sequence<Is...>&)
{
std::array<const char*, 3> values = {"one", "two", "three"};
std::array<int, 3> keys = {1, 2, 3};
foo_impl(std::get<Is%2>(std::tie(keys, values))[Is / 2]...);
}
int main()
{
foo(std::make_index_sequence<6>{});
}
我想知道如何以混合顺序将两个 std::arrays 的元素作为函数参数传递。如果参数的顺序无关紧要或者它是顺序的(当一个数组的元素应该在另一个数组的元素之后传递时),这是非常简单的任务。
我们可以像这样简单地使用折叠表达式
#include <array>
template <typename ...T>
void foo_impl(const T&... Args)
{
// The function will recieve arguments like this
//
// foo_impl("one", "two", "three", 1, 2, 3);
//
}
template <size_t ...Indexes>
void foo(const std::index_sequence<Indexes...>&)
{
std::array<const char*, 3> values = {"one", "two", "three"};
std::array<int, 3> keys = {1, 2, 3};
foo_impl((values[Indexes])..., (keys[Indexes])...);
}
int main()
{
foo(std::make_index_sequence<3>{});
return 0;
}
在这种情况下,函数 foo_impl 将按以下顺序接收参数 - ("one", "two", "three", 1, 2, 3),但对我来说,按特定顺序混合它们很重要。
我无法创建第三个数组并组合参数,因为它们具有不同的类型和实际数组包含的项目可能对 copy/move 来说相当昂贵。
此外,我无法在 foo_impl 函数级别重新组合参数,因为它们的顺序对日志系统很重要。以前我为此使用了很多宏。但现在我想重构这段代码,使其更现代、更易于调试和理解。
我想知道是否可以混合那些 std::array 元素(使用折叠表达式或类似的元编程技术)并像那样传递 ("one", 1, "two ", 2, "three", 3) 在调用 foo 或 foo_impl?
之前在此先感谢您的帮助!
P.S。抱歉我的英语不是母语。
在通过之前把它们变成一对:
#include <array>
#include <utility>
#include <iostream>
template <typename ...T>
void foo_impl(T... Args)
{
((std::cout << std::forward<T>(Args).first << " "<< std::forward<T>(Args).second << " "), ...);
// prints "1 one 2 two 3 three"
}
template <std::size_t ...Indexes>
void foo(const std::index_sequence<Indexes...>&)
{
std::array<const char*, 3> values = {"one", "two", "three"};
std::array<int, 3> keys = {1, 2, 3};
foo_impl(std::pair{keys[Indexes], values[Indexes]}...);
}
int main()
{
foo(std::make_index_sequence<3>{});
return 0;
}
你可能会
template <std::size_t ...Is>
void foo(const std::index_sequence<Is...>&)
{
std::array<const char*, 3> values = {"one", "two", "three"};
std::array<int, 3> keys = {1, 2, 3};
foo_impl(std::get<Is%2>(std::tie(keys, values))[Is / 2]...);
}
int main()
{
foo(std::make_index_sequence<6>{});
}