c++ - 分解模板参数包操作

标签 c++ variadic-templates c++17

在下面的模板函数定义中,我写了两次比较长的表达式details::transform(std::forward<T>(t))其中 t是一个参数包。

我该如何分解它?

auto pack = details::transform(std::forward<T>(t))当然不行。

template<class ...T>
void f(T&&... t)
{
    auto check = (details::transform(std::forward<T>(t)) && ...);
    if (check == false) {
        return;
    }
    details::act(details::transform(std::forward<T>(t))...);
}

出于测试目的,这里有一个 complete program on coliru .

最佳答案

C++ 有一个可悲的事实。转发可以成为一簇 token 。而且需要转发的表达越复杂,就越痛苦。

可悲的是,我所知道的唯一减轻它的方法是使用预处理器......

#define FWD(...) std::forward<decltype(__VA_ARGS__)>(__VA_ARGS__)

有了它,我们可以重构您的函数以使用 IILE 仅生成一次该包:

template<class ...T>
void f(T&&... t)
{
    [](auto&&... pack) {
        auto check = (FWD(pack) && ...);
        if (check == false) {
            return;
        }
        details::act(FWD(pack)...);
    }(details::transform(FWD(t))...);
}

那样的话,每个参数你只需要调用一次transform。我认为这是最终目标。否则,您可能可以使用预处理器在没有 lambda 的情况下生成更简单的东西。

关于c++ - 分解模板参数包操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51949542/

相关文章:

python - 组合图 : is there a TensorFlow import_graph_def equivalent for C++?

c++ - 函数的类型是否受其参数声明子句中是否存在函数参数包的影响?

c++ - 返回 std::tuple 并 move 语义/复制省略

c++ - 有什么理由在 C++1z 中使用 std::map::emplace() 而不是 try_emplace() 吗?

c++ - 在类体内初始化数据成员

c++ - 切割圆的底部

c++ - 关于 Boost Statechart 中状态变化的通知

c++ - 部分或完全匹配类型参数包

c++ - 部分模板特化,使用模板化类型(嵌套模板类)

c++ - 继承成员函数的模板参数推导