template<typename... Types>
class dynamicTuple {
public:
template<typename... Args>
dynamicTuple(Args&&... args) : elements(std::forward<Args>(args)...) {}
template<std::size_t Index>
decltype(auto) get_value() {
return std::get<Index>(elements);
}
template<typename... Args>
auto append(Args&&... args) {
return dynamicTuple<Types..., decltype(std::declval<Args>())...>(
std::get<Types>(elements)..., std::forward<Args>(args)...
);
}
// Member function to apply a given function to each element
template<typename F>
void apply_function(F&& func) {
(func(std::get<Types>(elements)), ...);
}
private:
std::tuple<Types...> elements;
template<typename... Ts>
friend void access_private(dynamicTuple<Ts...>& container);
};
// Nonmember function to access private member of dynamicTuple
template<typename... Types>
void access_private(dynamicTuple<Types...>& container) {
std::cout << "Printing private member: ";
container.apply_function([](auto&& value) { std::cout << value << " "; });
std::cout << std::endl;
}
int main() {
dynamicTuple<int, double, std::string> container(42, 3.14, "Hello");
std::cout << "get_value at index 0: " << container.get_value<0>() << std::endl;
auto appendedContainer = container.append("World", 101);
std::cout << "Container: " << std::endl;
access_private(container);
std::cout << "Appended Container: " << std::endl;
access_private(appendedContainer);
return 0;
}