提问者:小点点

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


我有如下列表

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 << " ";
}

我知道我将不得不重载ostream操作符来显示用户定义的数据。 但我希望你能明白我的问题。 我不知道编译器为什么抱怨参数列表。 什么是正确的方式来完成上述任务。 在Stackoverflow上找不到确切的答案,所以要提一下。

在Python中,我们可以简单地使用list和tada! 但是,如果不是元组,还有其他的方法可以做到这一点,可能是使用变量模板或其他东西。


共2个答案

匿名用户

您可以通过创建自己的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(my_tuple, [](auto&& mixed_ele){ std::cout << mixed_ele << ' '; });

C++23想要为制作一个名为模板的语言特性来替换那一堆制动器和parens(还不是官方的):

template for (auto&& mixed_ele : mixed) {
    std::cout << mixed_ele << ' ';
}

匿名用户

使用现在著名的Sean Parent的“for each argument”:

template <class F, class... Args>
void for_each_argument(F f, Args&&... args) {
    [](...){}((f(std::forward<Args>(args)), 0)...);
}

其中f是将参数流到std::cout的内容。

另请参阅:

如何迭代std::元组的元素?

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++14|访问|打印|元组|中|数据|模板|函数|显示)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?