Re[12]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 11.07.16 21:34
Оценка:
Здравствуйте, 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; }


Не суть, вариантов много.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.