使用C++14访问和打印元组中的数据,并使用模板函数显示数据

使用C++14访问和打印元组中的数据,并使用模板函数显示数据,c++,c++11,tuples,c++14,variadic-templates,C++,C++11,Tuples,C++14,Variadic Templates,我有一个如下的清单 my_mixed_list = {"Sample String", int_value, user_data_type} 我想使用C++11 std::tuple以简单的白色分隔方式显示上面的列表。 可能是这样的: template <typename T> void display_mixed_items (std::tuple <T> mixed) { for (const auto& mix

我有一个如下的清单

my_mixed_list = {"Sample String", int_value, user_data_type}
我想使用C++11 std::tuple以简单的白色分隔方式显示上面的列表。 可能是这样的:

template <typename T>
    void display_mixed_items (std::tuple <T> mixed) {
         for (const auto& mixed_ele : mixed) std::cout << mixed_ele << " ";
}
for_tuple(my_tuple, [](auto&& mixed_ele){ std::cout << mixed_ele << ' '; });
我知道我必须重载ostream操作符才能显示用户定义的数据。但我希望你明白这个问题。 我不知道为什么编译器会抱怨参数列表。完成上述任务的正确方法是什么。无法找到Stackoverflow的确切答案

在Python中,我们可以简单地使用list和tada!但是,如果不是tuple,还有其他方法吗?可能是使用可变模板或其他方法。

使用现在著名的Sean Parent:

template <class F, class... Args>
void for_each_argument(F f, Args&&... args) {
    [](...){}((f(std::forward<Args>(args)), 0)...);
}
f是将参数流式传输到std::cout的东西

另见:

使用Sean Parent现在著名的:

template <class F, class... Args>
void for_each_argument(F f, Args&&... args) {
    [](...){}((f(std::forward<Args>(args)), 0)...);
}
f是将参数流式传输到std::cout的东西

另见:


通过创建自己的for_tuple函数来迭代元组,您可以获得:

template<typename T, typename F, std::size_t... S>
void for_tuple_impl(std::index_sequence<S...>, T&& tup, F& function) {
    using expand_t = int[];
    (void) expand_t{(void(function(std::get<S>(std::forward<T>(tup)))), 0)..., 0};
}

template<typename T, typename F>
void for_tuple(T&& tup, F function) {
    for_tuple_impl(
        std::make_index_sequence<std::tuple_size<std::decay_t<T>>::value>{},
        std::forward<T>(tup),
        function
    );
}

通过创建自己的for_tuple函数来迭代元组,您可以获得:

template<typename T, typename F, std::size_t... S>
void for_tuple_impl(std::index_sequence<S...>, T&& tup, F& function) {
    using expand_t = int[];
    (void) expand_t{(void(function(std::get<S>(std::forward<T>(tup)))), 0)..., 0};
}

template<typename T, typename F>
void for_tuple(T&& tup, F function) {
    for_tuple_impl(
        std::make_index_sequence<std::tuple_size<std::decay_t<T>>::value>{},
        std::forward<T>(tup),
        function
    );
}

看这个。这应该有帮助。T是一种类型。此模板将只接受一种类型的元组。此外,for循环不适用于元组,如下所示。看来你需要。是的,我忘了读这本书了!谢谢提醒。哈哈。我已经更新了问题,想看看这个。这应该有帮助。T是一种类型。此模板将只接受一种类型的元组。此外,for循环不适用于元组,如下所示。看来你需要。是的,我忘了读这本书了!谢谢提醒。哈哈,我已经更新了问题,我现在就去试试。谢谢我看你把兰博达斯和前锋组合起来了。必须掌握LOT您应该使用初始值设定项列表,否则计算顺序未指定,这不利于流式传输到控制台。@cigien:等等。为什么?我们不是在初始化对象,而是在使用IILE。或者你的意思是在每一个参数之外?我的意思是围绕f的展开。基本上就像纪尧姆的回答,我现在就试试。谢谢我看你把兰博达斯和前锋组合起来了。必须掌握LOT您应该使用初始值设定项列表,否则计算顺序未指定,这不利于流式传输到控制台。@cigien:等等。为什么?我们不是在初始化对象,而是在使用IILE。或者你的意思是在每一个参数之外?我的意思是围绕f的展开。基本上像纪尧姆的答案。我的意思是,我知道我需要用这些差异数据类型创建一个枚举,但是有没有任何C++构造,而不使用EnUM数据类型,因为我知道我需要用这些差异数据类型创建一个枚举。但是,是否有任何C++构造要在不使用EnUM数据类型的情况下进行。