如何以元组 b 作为参数为元组(充当类型列表)中的每种类型调用模板化函数

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)

不确定这是否是最明智的方法。脑雾到目前为止阻碍了我让它发挥作用。

康桓瑋*_*康桓瑋 5

使用模板部分特化来提取类型列表的类型,然后使用折叠表达式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)

  • @克里斯G。`template&lt;template&lt;typename...&gt; class TL, typename...Args&gt; struct someFunctor&lt;TL&lt;Args...&gt;&gt; {` (3认同)