#include #include #include #include template class Container { public: template using Optional = std::experimental::optional; std::vector...>> elements; template C get(std::size_t index) const { return optional(index).value(); } template C get(std::size_t index, C&& defaultValue) const { return optional(index).value_or(std::move(defaultValue)); } template void set(std::size_t index, const C& c) { optional(index) = c; } template void emplace(std::size_t index, Args&&... args) { optional(index).emplace(args...); } template bool has(std::size_t index) const { return optional(index); } protected: template const Optional& optional(std::size_t index) const { return std::get>(elements.at(index)); } template Optional& optional(std::size_t index) { return std::get>(elements.at(index)); } }; int main() { Container container; container.elements.resize(10); container.emplace(0, 69); std::cout << container.get(0) << std::endl; return 0; }