Chr*_* G. 5 c++ tuples constexpr c++20
如何使用参数(例如另一个元组)为类型列表中的每种类型调用模板函数?
给定的是一个类型列表std::tuple<T1, T2, T3, ...>和一个std::tuple包含数据。
template <typename T>
void doSomething (const auto& arg) {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
template <typename T> struct w {T v; w(T _v) : v{_v} {}};
int main () {
using types = std::tuple<int, char, float, double, w<int>, w<float>>; // used as type list
constexpr auto data = std::make_tuple(1, 2, 3.0, 4.0f, w(5.0));
// call doSomething<T>(data) for each type in types
// like
// someFunctor<types>(doSomething, data);
}
Run Code Online (Sandbox Code Playgroud)
我当前的想法是一个类似函子的应用程序,它接收类型列表以提取下一个类型,并对每个 Tstd::tuple<Ts>进行operator ()调用。doSomething<T>(args)
template<template<typename...> typename TL, typename... Ts>
struct someFunctor {
template<typename... Args>
static constexpr void operator() (Args&&... args) {
(doSomething<Ts>(std::forward<Args>(args)...), ...);
}
};
Run Code Online (Sandbox Code Playgroud)
不确定这是否是最明智的方法。脑雾到目前为止阻碍了我让它发挥作用。
使用模板部分特化来提取类型列表的类型,然后使用折叠表达式doSomething以不同的模板参数进行调用
template<typename Tuple>
struct someFunctor;
template<typename... Args>
struct someFunctor<std::tuple<Args...>> {
template<class T>
constexpr void operator()(T&& x) {
(doSomething<Args>(std::forward<T>(x)), ...);
}
};
Run Code Online (Sandbox Code Playgroud)
using types = std::tuple<int, char, float, double, w<int>, w<float>>;
constexpr auto data = std::make_tuple(1, 2, 3.0, 4.0f, w(5.0f));
someFunctor<types>()(data);
Run Code Online (Sandbox Code Playgroud)