C++ tuple处理逻辑修改:数值求和、字符串拼接及剩余元素计数
核心修改点
- 修正求和条件:在算术类型判断基础上增加排除bool类型的逻辑,同时修复原代码的语法错误
&!为&& - 新增剩余元素计数逻辑:遍历tuple元素时,对既不满足求和条件、也不满足字符串拼接条件的元素计数
- 统一单次遍历tuple完成三个计算逻辑,避免多次遍历开销
完整可运行代码
#include <iostream> #include <tuple> #include <string> #include <type_traits> #include <algorithm> using namespace std; template<class ... Args> auto process_tuple(tuple<Args...> const& t) { double sum_res = 0.0; string concat_res; size_t leftover_cnt = 0; auto process_element = [&](auto&& arg) { using T = decay_t<decltype(arg)>; constexpr bool is_summable = is_arithmetic_v<T> && !is_same_v<T, bool>; constexpr bool is_concatable = is_convertible_v<T, string>; if constexpr (is_summable) { sum_res += arg; } else if constexpr (is_concatable) { concat_res += arg; // 若需要拼接的字符串之间加空格,可取消下一行注释,最后再修剪末尾空格即可 // concat_res += " "; } else { leftover_cnt++; } }; apply([&](auto&&... args) { (process_element(args), ...); }, t); return make_tuple(sum_res, concat_res, leftover_cnt); } template<class ... Args> void test(tuple<Args...> t) { auto [sum_val, concat_val, leftover] = process_tuple(t); cout << "(" << sum_val << ", \"" << concat_val << "\", " << leftover << ")" << endl; } int main(){ test(make_tuple(10, true, "Hello", 2.3f, "World")); }
运行输出
(12.3, "HelloWorld", 1)
内容的提问来源于stack exchange,提问作者Jeffergesen
相关产品推荐
相关产品推荐

