我有一个容器类,它接受一个vector
或array
对象列表(并存储对原始对象列表的元组引用)。现在,在通过operator()(size_t idx)
调用容器时,我希望该函数返回一个包含每个向量/数组中索引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)
。我该怎么做呢?
Container(const Ts&... objs)
中的所有输入是否具有相同的大小?我只想到了const size_t N = std::get<0>(m_data).size(); auto check_same = [N](const auto& obj) { if (N != obj.size()) throw; }; (check_same(objs), ...);
。 - Phil-ZXXstd::array<std::size_t, sizeof...(objs)> arr{ objs.size()... }; if (std::unique( arr.begin(), arr.end() )-arr.begin() != 1) { throw; }
- Yakk - Adam Nevraumont