C ++ 17中的折叠表达式

时间:2019-12-16 22:30:57

标签: c++ c++17 fold-expression

我正在阅读《 C ++ 17-完整指南》一书,在107和108页上遇到了有关C ++ 17中折叠表达的示例:

template<typename First, typename... Args>
void print(First first, const Args&... args)
{
    std::cout << first;
    auto outWithSpace = [](const auto& arg)
    {
        std::cout << " " << arg;
    };
    (..., outWithSpace(args));
    std::cout << "\n";
}

是否有任何原因导致作者无法按以下方式进行操作(没有将第一个参数与其余参数分开,并且没有多余的打印空间!):

template<typename... Types>
void print(Types const&... args)
{
    ([](const auto& x){ std::cout << x << " "; }(args), ...);
    std::cout << "\n";
}

4 个答案:

答案 0 :(得分:3)

您已经知道,作者可能并没有按照您的建议进行操作,因为那样会留下额外的空间……

作者可能所做的事情就像

template<typename First, typename... Args>
void print(First first, const Args&... args)
{
    ((std::cout << first), ..., (std::cout << ' ' << args)) << '\n';
}

或者,宁可

template <typename Arg, typename... Args>
std::ostream& print(Arg&& arg, Args&&... args)
{
    return ((std::cout << std::forward<Arg>(arg)), ..., (std::cout << ' ' << std::forward<Args>(args))) << '\n';
}

实时示例here

答案 1 :(得分:0)

不,这只是美学问题。没有更多的理由。

答案 2 :(得分:0)

简单地说,可读的编写方式是

template<typename... Types>
void print(Types const&... args)
{
    std::size_t n = 0;
    (std::cout << " " + !n++ << args), ...);
    std::cout << '\n';
}

(带有std::forward的味道)。进行此类废话的诱惑(如果C ++ 17没有杀死精彩功能,则可以使用bool first)是计划为template for功能准备的动机。 C ++ 23。

答案 3 :(得分:0)

由于我们与朋友度过了愉快的时光

template<typename First, typename... Args>`
void print(First&& first, Args&&... args)
{
    auto emit = [](auto&&...x) { ((std::cout << x), ...); };

    (emit(first), ..., emit(' ', args)), emit('\n');
}

:)