六月 04, 2022 [c++, tuple] #c++ #tuple
tuple sum
遍历std::tuple
#include <tuple>
#include <iostream>
using std::cout;
using std::make_tuple;
template<typename T>
std::enable_if_t<!std::is_arithmetic<T>::value, double> double_val(T t) { return 0.0; }
template<typename T>
std::enable_if_t<std::is_arithmetic<T>::value, double> double_val(T t) { return t; }
double double_val(char) { return 0.0; }
template<std::size_t I=0, typename ...Ts>
std::enable_if_t<(I == sizeof...(Ts)), double> tuple_sum(const std::tuple<Ts...>& tpl) {
return 0.0;
}
template<std::size_t I=0, typename ...Ts>
std::enable_if_t<(I < sizeof...(Ts)), double> tuple_sum(const std::tuple<Ts...>& tpl) {
return double_val(std::get<I>(tpl)) + tuple_sum<I+1, Ts...>(tpl);
}
int main() {
cout << tuple_sum(make_tuple(1,2,3,'c','t', 4.0)) << "\n";
return 0;
}
使用apply实现
#include <tuple>
#include <type_traits>
#include <iostream>
#include <vector>
#include <string>
using namespace std::string_literals;
template <typename T>
double filter(T arg)
{
if constexpr (std::is_same_v<T, char>) {
return 0.0;
} else if constexpr (std::is_integral_v<T> || std::is_floating_point_v<T>) {
return arg;
} else {
return 0;
}
}
template <typename ...Ts>
double tuple_sum(const std::tuple<Ts...>& tpl) {
return std::apply([](auto&&... args) {return (filter(args) + ...); }, tpl);
}
using namespace std;
int main() {
cout << tuple_sum(make_tuple(3.14, 42, 'a', "hello", "world"s, std::vector<int>{1,2,4}));
return 0;
}