Сообщение [mini-trick] emulation of "anonymous types" от 12.10.2014 7:38
Изменено 12.10.2014 9:00 Evgeny.Panasyuk
auto scope_value = 123;
cout << "NEW demo:" << endl;
auto xs = fusion::make_vector
(
NEW((y, 0.5)(x, scope_value + 1)),
NEW((x, 0.05)(y, 10)(p, 0.001))
);
fusion::for_each(xs, [](auto x)
{
cout << "x.x = " << x.x << ", sizeof(x) = " << sizeof(x) << endl;
});
cout << endl << "NEW_LAZY demo:" << endl;
fusion::for_each(transform(xs, NEW_LAZY((y, scope_value + 11)(q, _1))), [](auto x)
{
cout << "x.q.x = " << x.q.x << ", sizeof(x) = " << sizeof(x) << endl;
});
Output:NEW demo:
x.x = 124, sizeof(x) = 16
x.x = 0.05, sizeof(x) = 24
NEW_LAZY demo:
x.q.x = 124, sizeof(x) = 24
x.q.x = 0.05, sizeof(x) = 32
LIVE DEMO
code | |
| |
NEW_LAZY можно сделать на основе лямбд, без bind'а — тогда не будет bind expression, зато будет работать member access у аргументов.
Думаю при желании/необходимости можно адаптировать структуру к Boost.Fusion через CRTP (что-то наподобие BOOST_FUSION_DEFINE_STRUCT_INLINE).
Где применимо не знаю. Если такое потребуется — можно и лямбду вручную расписать.
Встретилось нечто подобное при решении одной задачки. Оставляю здесь — может кому пригодится / на какие мысли наведёт.
P.S. Эта реализация для C++14. В первом же варианте реализация была C++11, но без LAZY:
first version | |
http://coliru.stacked-crooked.com/a/d38afecc3a2a893c
| |
[mini-trick] emulation of "anonymous types"
auto scope_value = 123;
cout << "NEW demo:" << endl;
auto xs = fusion::make_vector
(
NEW((y, 0.5)(x, scope_value + 1)),
NEW((x, 0.05)(y, 10)(p, 0.001))
);
fusion::for_each(xs, [](auto x)
{
cout << "x.x = " << x.x << ", sizeof(x) = " << sizeof(x) << endl;
});
cout << endl << "NEW_LAZY demo:" << endl;
fusion::for_each(transform(xs, NEW_LAZY((y, scope_value + 11)(q, _1))), [](auto x)
{
cout << "x.q.x = " << x.q.x << ", sizeof(x) = " << sizeof(x) << endl;
});
Output:NEW demo:
x.x = 124, sizeof(x) = 16
x.x = 0.05, sizeof(x) = 24
NEW_LAZY demo:
x.q.x = 124, sizeof(x) = 24
x.q.x = 0.05, sizeof(x) = 32
LIVE DEMO
code | |
| |
NEW_LAZY можно сделать на основе лямбд, без bind'а — тогда не будет bind expression, зато будет работать member access у аргументов.
Думаю при желании/необходимости можно адаптировать структуру к Boost.Fusion через CRTP (что-то наподобие BOOST_FUSION_DEFINE_STRUCT_INLINE).
Где применимо не знаю. Если такое потребуется — можно и лямбду вручную расписать.
Встретилось нечто подобное при решении одной задачки. Оставляю здесь — может кому пригодится / на какие мысли наведёт.
P.S. Эта реализация для C++14. В первом же варианте реализация была C++11, но без LAZY:
first version | |
http://coliru.stacked-crooked.com/a/d38afecc3a2a893c
| |