mystruct( plain_old_function ); कंस्ट्रक्टर डिफॉल्ट कंस्ट्रक्टर को कॉल क्यों नहीं करता है जबकि लैम्ब्डा के साथ यह स्पेशलाइज्ड (mystruct ( const std::function< std::string() > &func )) को कॉल करता है?

क्या यह काम करने के लिए बनाया जा सकता है?

#include <iostream>
#include <functional>
#include <string>

struct mystruct
{
    mystruct() { std::cout << "Default construct :S" << std::endl; }
    mystruct ( const std::function< std::string() > &func )  {
        std::cout << func() << std::endl;
    }
};

void callme ( const std::function< std::string() > &func )
{
    std::cout << func() << std::endl;
}

std::string free_function(  ) {  return "* Free function"; }


int main()
{

    std::cout << "Constructing with lambda:" << std::endl;
    mystruct( [](){ return "* Lambda function"; } );

    std::cout << "Calling free  function through another function:" << std::endl;
    callme( free_function );

    std::cout << "Constructing with free function:" << std::endl;
    mystruct( free_function );

    return 0;
}

डेमो

आउटपुट:

Constructing with lambda:
* Lambda function
Calling free  function through another function:
* Free function
Constructing with free function:
Default construct :S
3
Steve Rodeen 12 सितंबर 2017, 18:58

2 जवाब

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

वेक्सिंग पार्स,

mystruct( free_function );

के रूप में पार्स किया गया है

mystruct free_function; // declare a mystruct instance named free_function
                        // (hiding the function)

आप {} का उपयोग कर सकते हैं:

mystruct{free_function};
7
Jarod42 12 सितंबर 2017, 19:04

जबकि आपको निश्चित रूप से ब्रेस इनिशियलाइज़ेशन पसंद करना चाहिए, इस मामले में आप अयोग्य नाम लुकअप के बजाय योग्य लुकअप करके दूसरे तरीके से वेक्सिंग पार्स से बच सकते हैं:

mystruct( ::free_function );

इसे free_function नाम के एक नए पहचानकर्ता को पेश करने के लिए हल नहीं किया जा सकता है।

0
StoryTeller - Unslander Monica 12 सितंबर 2017, 19:48