将整数序列与元组和可变参数模板一起使用

Flu*_*ffy 3 c++ tuples template-meta-programming variadic-templates c++17

假设我有一个元组:

std::tuple<int, char, unsigned int> t{1, 'a', 4}
Run Code Online (Sandbox Code Playgroud)

如何使用std::index_sequence和朋友迭代上述元组的类型,以便可以使用(或在需要时重写)以下函数to_token

template<typename P1, typename... Param>
std::vector<std::string> to_token(const P1& p1, const Param&... param) {
    const auto to_token_impl = [](const auto& t) {
        using ParamType = std::decay_t<decltype(t)>;
        std::stringstream ss;

        if constexpr (std::is_same_v<ParamType, char>)
            ss << "char";
        else if constexpr (std::is_integral_v<ParamType>) {
            ss << "integral";
        }
        return ss.str();
    };
    return {to_token_impl(p1), to_token_impl(param)...};
}
Run Code Online (Sandbox Code Playgroud)

预期产量: { "integral", "char", "integral" }

根据此处找到的示例,我已经开始研究这种间接方式,但是我无法确定下一步该怎么做...

template<typename... Args>
void tokenize(const std::tuple<Args...>& t) {
    tokenize_impl(t, std::index_sequence_for<Args...>{});
}

template<typename Tuple, std::size_t... Is>
void tokenize_impl(const Tuple& t, std::index_sequence<Is...>) {
    // ?
}
Run Code Online (Sandbox Code Playgroud)

Que*_*tin 6

template<typename... Args>
decltype(auto) tokenize(const std::tuple<Args...>& t) {
    return std::apply(
        [](auto const &... o) -> decltype(auto) { return to_token(o...); },
        t
    );
}
Run Code Online (Sandbox Code Playgroud)

要求lambda推迟to_token参数的推导,直到它可以实际发生在内为止std::apply,否则to_token就没有确定的类型并且不能作为参数传递。

  • @Fluffy为什么,为什么,为什么为什么不先测试就继续发布答案。修复中... (2认同)