将函数应用于向量元组以获取元素元组(可变参数模板)
Apply function to tuple of vectors to get tuple of elements (variadic templates)
我有一个容器 class,它接受 vector
或 array
对象的列表(并存储对原始对象列表的引用的元组)。现在,当通过 operator()(size_t idx)
调用容器时,我希望函数 return 一个包含每个 vectors/arrays.
索引 idx
处的元素的元组
template<class... Ts>
class Container
{
public:
Container(const Ts&... objs)
: m_data(objs...) { }
auto operator()(size_t idx) const
{
const auto get_idx = [idx](const auto& obj) { return obj.at(idx); };
return std::tuple<const Ts::value_type& ...>((get_idx(m_data), ...)); // <-- does not compile
}
private:
std::tuple<const Ts&...> m_data;
};
int main()
{
std::vector<int> v1{ 3,4,12,5 };
std::vector<std::string> v2{ "on", "test", "ABC", "house" };
std::array<double, 4> v3 = { 3.14, 2.71, 99.3, 128 };
const auto z = Container(v1, v2, v3);
auto v = z(2); // <-- does not compile
return 0;
}
例如,上面的z(2)
应该等于std::tuple<int, std::string, double>(12, "ABC", 99.3)
。我将如何实现?
你有一个tuple
,你需要把它变成一个包。这样做的方法是 std::apply()
:
auto operator()(size_t idx) const
{
return std::apply([=](auto const&... xs){
return std::make_tuple(xs.at(idx)...);
}, m_data);
}
xs
这里是引用m_data
内容的包。一旦我们有了这个包,用它做任何事情都很简单。
我有一个容器 class,它接受 vector
或 array
对象的列表(并存储对原始对象列表的引用的元组)。现在,当通过 operator()(size_t idx)
调用容器时,我希望函数 return 一个包含每个 vectors/arrays.
idx
处的元素的元组
template<class... Ts>
class Container
{
public:
Container(const Ts&... objs)
: m_data(objs...) { }
auto operator()(size_t idx) const
{
const auto get_idx = [idx](const auto& obj) { return obj.at(idx); };
return std::tuple<const Ts::value_type& ...>((get_idx(m_data), ...)); // <-- does not compile
}
private:
std::tuple<const Ts&...> m_data;
};
int main()
{
std::vector<int> v1{ 3,4,12,5 };
std::vector<std::string> v2{ "on", "test", "ABC", "house" };
std::array<double, 4> v3 = { 3.14, 2.71, 99.3, 128 };
const auto z = Container(v1, v2, v3);
auto v = z(2); // <-- does not compile
return 0;
}
例如,上面的z(2)
应该等于std::tuple<int, std::string, double>(12, "ABC", 99.3)
。我将如何实现?
你有一个tuple
,你需要把它变成一个包。这样做的方法是 std::apply()
:
auto operator()(size_t idx) const
{
return std::apply([=](auto const&... xs){
return std::make_tuple(xs.at(idx)...);
}, m_data);
}
xs
这里是引用m_data
内容的包。一旦我们有了这个包,用它做任何事情都很简单。