So, I am trying to replace the following code (C ++ 11):
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), ... };
with C ++ 03 compatible code that gives the same effect:
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)); }
Without a doubt, the Visual C ++ Studio 2008 Express SP1 compiler rejects lambda expressions, using boost will not help either, except that bind () and lambda boost got that I'm not quite sure how to do this with this.
To tell more about this, I also want to be able to use this:
using namespace boost::assign; static std::vector<test> tests; static void init_tests(void) { push_back(tests) define_test(...) ...; }
this means that structures with static functions will not matter much, for example:
#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) )
This is because I am writing a ton of this, and C ++ 11 was so easy.