C++如何遍历未知tuple实现数值累加与可转字符串对象拼接
实现方案
我们可以通过C类型萃取工具判断tuple元素类型,在遍历过程中分别完成数值累加、字符串拼接逻辑,完整可运行代码如下(需C17及以上版本编译):
#include <iostream> #include <tuple> #include <string> #include <type_traits> using namespace std; // 递归终止条件 template <size_t I = 0, typename... Ts> typename enable_if<I == sizeof...(Ts), void>::type processTuple(tuple<Ts...> t, double& sum, string& str) { return; } template <size_t I = 0, typename... Ts> typename enable_if<(I < sizeof...(Ts)), void>::type processTuple(tuple<Ts...> t, double& sum, string& str) { auto val = get<I>(t); using T = decay_t<decltype(val)>; // 数值类型累加,这里排除bool类型以对齐示例输出,若需将bool计入可删除第二个判断条件 if constexpr (is_arithmetic_v<T> && !is_same_v<T, bool>) { sum += val; } // 可转换为string的类型拼接 if constexpr (is_convertible_v<T, string>) { if (!str.empty()) str += " "; // 元素间加空格对齐示例 str += val; } processTuple<I + 1>(t, sum, str); } int main() { tuple <int32_t, bool, std::string, float, const char*> t(1, true, "hello", 2.1f, "world"); double sum = 0.0; string result_str; processTuple(t, sum, result_str); cout << sum << endl; cout << "\"" << result_str << "\"" << endl; return 0; }
运行结果
3.1 "hello world"
核心逻辑说明
- 数值类型判断使用
std::is_arithmetic_v,默认包含int、float、double、bool等算术类型,示例中排除bool是为了和提问给出的输出结果对齐,可根据需求调整判断规则 - 字符串转换判断使用
std::is_convertible_v<T, std::string>,自动识别const char*、std::string等可直接转换为字符串的类型 - 使用
if constexpr做编译期分支判断,不会生成无效类型操作的代码,避免编译错误
内容的提问来源于stack exchange,提问作者Jeffergesen
相关产品推荐
相关产品推荐

