Quindi, sto cercando di sostituire il seguente codice (C++ 11):lambda in C++ 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),
...
};
con un codice compatibile C++ 03 che dà lo stesso effetto:
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));
}
senza dubbio, il C++ Studio 2008 compilatore Visual Express SP1 respinge le espressioni lambda, usare il boost non aiuterebbe neanche, tranne che è stato bind() e la spinta lambda ottenuto, che io non sono esattamente sicuro di come lo farei fallo con questo.
Per elaborare più su questo, voglio essere in grado di utilizzare in questo modo:
using namespace boost::assign;
static std::vector<test> tests;
static void init_tests(void) {
push_back(tests)
define_test(...)
...;
}
questo significa che le strutture con funzioni statiche non saranno di grande aiuto sia per esempio:
#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))
Questo perché sto scrivendo un sacco di questo e C++ 11 è stato così facile.
temo, siete alla ricerca di convenienza disturbare la manutenzione del codice. (Passando una funzione non banale come parametro macro) –
@ DieterLücking Bene, ho finito per ridisegnare l'intera cosa :(devo amare C++ –