Więc staram się zastąpić następujący kod C++ (11):lambda w 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),
...
};
C++ z kodem 03 kompatybilnym który daje ten sam efekt:
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));
}
Bez wątpienia kompilator Visual C++ Studio 2008 Express SP1 odrzuca wyrażenia lambda, użycie boost też by nie pomogło, z wyjątkiem funkcji bind() i boostu lambda, którego nie jestem do końca pewny, w jaki sposób zrób to z tym.
Aby opracować więcej na ten temat, chcę być w stanie wykorzystać tak:
using namespace boost::assign;
static std::vector<test> tests;
static void init_tests(void) {
push_back(tests)
define_test(...)
...;
}
to znaczy kodowanym z funkcji statycznych nie będzie zbyt pomocne albo np
#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))
To dlatego, że piszę tonę tego i C++ 11 było tak łatwe.
boję, szukasz wygody niepokojące zachowanie kodu. (Przekazanie nietrywialnej funkcji jako parametru makro) –
@ DieterLücking Cóż, skończyłem na przeprojektowaniu tego wszystkiego :(muszę pokochać C++ –