मैं जेसेक गैलोविक्ज़ द्वारा सी ++ 17 एसटीएल कुकबुक से सी ++ 17 सीखता हूं और लैम्ब्डा के बारे में ऐसा एक उदाहरण है:

template <typename... Ts> static auto multicall(Ts... functions)
{
    return [=](auto x) { (void)std::initializer_list<int>{((void)functions(x), 0)...}; };
}

template <typename F, typename... Ts> static auto for_each(F f, Ts... xs)
{
    (void)std::initializer_list<int>{((void)f(xs), 0)...};
}

static auto brace_print(char a, char b)
{
    return [=](auto x) { std::cout << a << x << b << ", "; };
}

int main()
{
    auto f(brace_print('(', ')'));
    auto g(brace_print('[', ']'));
    auto h(brace_print('{', '}'));
    auto nl([](auto) { std::cout << '\n'; });

    auto call_fgh(multicall(f, g, h, nl));

    for_each(call_fgh, 1, 2, 3, 4, 5);
}

यहां std::initializer_list का उपयोग क्यों किया गया है और यह void कास्टिंग का उपयोग क्यों किया गया है (लेखक लिखते हैं कि सी-जैसी कास्टिंग के बजाय reinterpret_cast का उपयोग किया जाना चाहिए, लेकिन सवाल यह है कि ऐसा क्यों है कास्टिंग का इस्तेमाल किया)?

जब मैं multicall और for_each फ़ंक्शन को इस प्रकार बदलता हूं:

template <typename... Ts> static auto multicall(Ts... functions)
{
    return [=](auto x) { (functions(x), ...); };
}

template <typename F, typename... Ts> static auto for_each(F f, Ts... xs)
{
    (f(xs), ...);
}

सब कुछ उम्मीद के मुताबिक काम करता है, मुझे वही परिणाम मिलते हैं।

2
K. Koovalsky 27 अप्रैल 2019, 14:41

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि कुछ कारणों से पुस्तक का यह भाग C++14-way संचालित करता है। सी ++ 17 में फोल्ड एक्सप्रेशन पेश किए जाने से पहले std::initializer_list के साथ ट्रिक की जरूरत थी ताकि एम्यूलेट वैरिएडिक कॉल को कॉल किया जा सके। C++17 में कॉमा ऑपरेटर के साथ फोल्ड बिल्कुल वैध है

1
Dmitry Gordon 27 अप्रैल 2019, 11:56