2015-02-05 6 views
5

तो, मैं निम्नलिखित कोड (सी ++ 11) को बदलने के लिए कोशिश कर रहा हूँ:lambdas में सी ++ 03

:

struct test { 
    const char *n; 
    int i; 

    std::function<int(void)> read; 
    std::function<void(int)> write; 
}; 

#define define_test(n, i, bodyRead, bodyWrite) \ 
    { n, i, []() { bodyRead; }, [](int v) { bodyWrite; } } 

std::initializer_list<test> tests = { 
    define_test("test1", 1, return 1, v = 2), 
    ... 
}; 
एक सी ++ 03 संगत कोड है कि एक ही प्रभाव देता साथ

struct test { 
    test(const char *_n, int _i, boost::function<int(void)> _read, boost::function<void(int)> _write) { 
     n = _n; 
     i = _i; 
     read = _read; 
     write = _write; 
    } 

    const char *n; 
    int i; 

    boost::function<int(void)> read; 
    boost::function<void(int)> write; 
}; 

#define define_test(n, i, bodyRead, bodyWrite) \ 
    (n, i, []() { bodyRead; }, [](int v) { bodyWrite; }) 

std::vector<test> tests; 
static void init_tests(void) { 
    tests.push_back(define_test("test1", 1, return 1, v = 2)); 
} 
कोई संदेह नहीं है के साथ

, विजुअल C++ स्टूडियो 2008 एक्सप्रेस SP1 संकलक लैम्ब्डा भाव को खारिज कर दिया, को बढ़ावा देने का उपयोग कर या तो इसे मदद नहीं होता, सिवाय इसके लिए बाध्य किया गया था() और लैम्ब्डा बढ़ावा मिला है, जो मैं वास्तव में यकीन है कि मैं कैसे होगा नहीं कर रहा हूँ इसके साथ करो

इस बारे में अधिक विस्तार से बता दें मैं भी तो की तरह उपयोग करने के लिए सक्षम होना चाहते हैं:

using namespace boost::assign; 
static std::vector<test> tests; 
static void init_tests(void) { 
    push_back(tests) 
     define_test(...) 
     ...; 
} 

मतलब यह है कि स्थिर कार्यों के साथ structs ज्यादा मदद या तो जैसे की नहीं होगी:

#define define_test(n, i, bodyRead, bodyWrite) \ 
    struct { 
     static void fn##n(void) { bodyRead; } \ 
     static void fnw##n(int v) { bodyWrite; } \ 
    }; \ 
    (n, i, boost::bind(&fn##n), boost::bind(&fnw##n, boost::placeholders::_1)) 

ऐसा इसलिए है क्योंकि मैं इसका एक टन लिख रहा हूं और सी ++ 11 इतना आसान था।

+0

मुझे डर है, आप सुविधा कोड के रखरखाव के परेशान करने के लिए देख रहे हैं। (एक मैक्रो पैरामीटर के रूप में एक गैर तुच्छ कार्य को पास करना) –

+0

@ डाइटर लुकिंग वेल, मैंने इस पूरी चीज को फिर से डिजाइन करना समाप्त कर दिया :(प्यार सी ++ –

उत्तर

4

उदाहरण के लिए, आप बूस्ट फीनिक्स के साथ कुछ इकट्ठा कर सकते हैं।

s_tests.push_back(test ("test1", 1, phx::val(1), phx::ref(v) = arg1*1)); 
s_tests.push_back(test ("test2", 2, phx::val(2), phx::ref(v) = arg1*2)); 
प्राकृतिक सी

यह प्राप्त नहीं होंगे ++ वाक्य रचना, लेकिन कम से कम यह बहुत पूर्ण (यह अपवाद भी while_, for_, switch_, स्थानीय लोगों, बाँध (समर्थन करता है) आदि) विशेष रुप से प्रदर्शित किया जाएगा:

Live On Coliru

#include <boost/function.hpp> 

struct test { 
    const char *n; 
    int i; 

    boost::function<int(void)> read; 
    boost::function<void(int)> write; 

    test(char const* n, int i, boost::function<int(void)> read, boost::function<void(int)> write) 
     : n(n), i(i), read(read), write(write) 
    {} 
}; 

#include <boost/phoenix.hpp> 
#include <vector> 
using namespace boost::phoenix::arg_names; 
namespace phx = boost::phoenix; 

namespace mocks { 
    static int v; 

    typedef std::vector<test> test_t; 

    test_t const& tests() { 
     static test_t s_tests; 
     if (s_tests.empty()) 
     { 
      s_tests.push_back(test ("test1", 1, phx::val(1), phx::ref(v) = arg1*1)); 
      s_tests.push_back(test ("test2", 2, phx::val(2), phx::ref(v) = arg1*2)); 
     } 

     return s_tests; 
    } 
} 

#include <iostream> 

int main() { 


    for (mocks::test_t::const_iterator it = mocks::tests().begin(); 
      it != mocks::tests().end(); ++it) 
    { 
     test const& test = *it; 
     std::cout << "'" << test.n << "'\t" << test.i << ", " << test.read() << ", "; 

     test.write(42); 
     std::cout << "mock v: " << mocks::v << "\n"; 
    } 
} 

प्रिंटों

'test1' 1, 1, mock v: 42 
'test2' 2, 2, mock v: 84 
+0

नमूना बनाया गया ** [वास्तव में लाइव] (http://coliru.stacked-crooked.com/ए/3bc8a371eb64c923) ** और सी ++ 03 सबूत। (बेशक, सी ++ 11 विशिष्ट कई अन्य विवरण थे।) – sehe

+0

क्षमा करें अगर मेरी टिप्पणी थोड़ा अस्पष्ट था। मान लीजिए कि मैं कुछ टाइपिंग सहेजना चाहता हूं उदाहरण के लिए '# परिभाषित करें define_test (n, i, bodyRead, bodyWrite) (n, i, boost :: फीनिक्स :: वैल (bodyRead), boost :: फीनिक्स :: ref (v) = boost :: फीनिक्स :: arg_names :: arg1; if_ (v) [bodyWrite;]} 'या शायद बस' [bodyWrite;] ' –

+0

मुझे यकीन नहीं है कि आप किस टाइपिंग को सहेजने की कोशिश कर रहे हैं। मुझे नहीं लगता कि आप" प्राकृतिक C++ कथन शामिल करने में सक्षम हैं "सीधे आपके सपने देखने वाले मैक्रो में (यह लैम्बडास का विक्रय बिंदु है)। हालांकि, मेरी राय में, बूस्ट फीनिक्स एक सुंदर सभ्य नौकरी बंद कर रहा है। मैं प्रति लिंक का उपयोग करने का सुझाव देता हूं पेज, या अपनी आवश्यकताओं पर पुनर्विचार करने के लिए :) – sehe

संबंधित मुद्दे