3

有没有一种简单的方法可以将 As 的当前添加到index包含arg 它的 lambda 调用中,所以我不需要使用index++

template <typename... Args>
void Function(Args... args) {
    std::size_t size = sizeof...(Args);

    std::size_t index = 0;
    auto process = [] <typename Arg> (Arg && arg) {
        index++;
        if (typeid(arg) == typeid(char*) || typeid(arg) == typeid(const char*)) {
            std::size_t sValueSize = strlen(arg) + 1;
        }

    };
    (process(std::forward<Args>(args)), ...);
}
4

2 回答 2

3

您可以使用辅助函数和 a std::index_sequence,它可以让您解压缩 args 和索引并将它们传递给 fold 表达式中的 lambda:

template <std::size_t... Indices, typename... Args>
void FunctionImpl(std::index_sequence<Indices...>, Args&&... args) {
    auto process = [] <typename Arg> (std::size_t index, Arg&& arg) {
        std::cout << index << ": " << arg << "\n";
    };
    (process(Indices, std::forward<Args>(args)), ...);
}

template <typename... Args>
void Function(Args&&... args) {
    FunctionImpl(std::make_index_sequence<sizeof...(args)>(), std::forward<Args>(args)...);
}

现场演示

于 2020-06-07T16:39:15.667 回答
2

有没有一种简单的方法来添加 arg [?] 的当前索引

在我看来,您的使用index是一种简单的方法。请记住按照 QuentinUK 的建议在 lambda 中捕获它。

无论如何,我建议另一个级别的间接和std::index_sequence/的使用std::index_sequence_for如下

template <typename... Args>
void Function (Args... args)
 {
   []<std::size_t ... Is>(std::index_sequence<Is...>, auto && ... as)
    { 
      auto process = []<typename Arg>(std::size_t index, Arg && arg)
         { 
           if constexpr (    std::is_same_v<Arg, char *>
                          || std::is_same_v<Arg, char const *> )
            {
              std::size_t sValueSize = strlen(arg) + 1;

              // do something with sValueSize
            }
         };

      (process(Is, std::forward<decltype(as)>(as)), ...);
    }
   (std::index_sequence_for<Args...>{}, std::forward<Args>(args)...);
 }

题外话 1:template-lambda 是 C++20 的一个特性。

题外话 2:我强烈建议使用if constexpr

    if constexpr (    std::is_same_v<Arg, char *>
                   || std::is_same_v<Arg, char const *> )

而不是你的普通(运行时)if

    if (typeid(arg) == typeid(char*) || typeid(arg) == typeid(const char*))

因为,对于普通if的 ,编译器必须编译if

        std::size_t sValueSize = strlen(arg) + 1;

当 test 为 false 并且是与 .arg不兼容的类型时也是如此strlen()

于 2020-06-07T16:51:40.317 回答