Здравствуйте, Erop, Вы писали:
EP>>EP>> struct field
EP>> {
EP>> T number;
EP>> };
EP>>
E>А смысл? Как предлагается это использовать?
В запросах к БД в SELECT указывается список полей которые должна содержать строка результирующего набора. Для удобства использования в коде нужно создавать структуру с аналогичным набором полей.
Смотри функцию handwritten из первого сообщения, в ней есть структура:
struct Row
{
double value;
int id;
int number;
} row;
vector_noinline<Row> xs;
Которая соответствует полям в SELECT:
SELECT foo.value, foo.id, foo.number FROM foo WHERE foo.id>42
Трюк выше нужен для автогенерации такой структуры. Собственно он и используется в исходном сообщении:
for(auto &&x : to_vector(
from(foo)
.where(foo.id > 42_i)
.select(foo.value, foo.id, foo.number)
))
{
using namespace std;
cout << "ROW: " << x.id << " " << x.value << " " << x.number << endl;
// cout << x.code; // - compile error, because .code is not in projection
}
Вот
упрощённый пример этого трюка
template<typename ...Columns>
struct row : Columns::field...
{};
template<typename ...Columns>
auto select(Columns...)
{
return row<Columns...>{};
}
E>Думаю, что лучше тогда уж сделать что-то вроде:
E>template<typename T> static auto member_ptr() { return &T::number; }
Не суть, вариантов много.