簡體   English   中英

C++17 中的折疊表達式

[英]Fold Expression in C++17

我正在閱讀“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";
}

正如您已經發現的那樣,作者無法按照您的建議進行操作,因為那樣會留下額外的空間……

作者本來可以做的,就像

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';
}

現場示例在這里

顯然,寫這個的可讀方式是

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使用bool first )是為 C++23 計划的特性template for的動機。

因為我們和朋友一起玩得很開心

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

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

:)

不,這只是審美問題。 沒有更多的理由了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM