#include <iostream>
#include <vector>
// Эта штука чтобы получить количество элементов в __VA_ARGS__ как compile-time константу
// используется в sizeof выражении, поэтому не требуется реализация методов
template<class T, std::size_t Count>
struct comma_counter
{
static comma_counter<T, Count> make();
comma_counter<T, Count + 1> operator,(T);
typedef char ch_array[Count];
ch_array& to_ch_array();
};
#define COUNT_ARGS(type, ...) sizeof((comma_counter<type, 0>::make(),__VA_ARGS__).to_ch_array())
// Здесь хранятся элементы
template<class T, std::size_t Count>
struct temporary_storage
{
T data[Count];
static temporary_storage<T, Count> make() { return temporary_storage(); }
// Это заполняет хранилище
template<std::size_t Pos>
struct comma_filler
{
temporary_storage& st;
comma_filler(temporary_storage& st) : st(st) {}
comma_filler<Pos + 1> operator,(T t)
{
st.data[Pos] = t;
return comma_filler<Pos + 1>(st);
}
// Выдаёт результирующий контейнер
template<class Container>
Container to_container() const
{
return Container(st.data, st.data + Pos);
}
};
comma_filler<0> fill() { return comma_filler<0>(*this); }
};
// Всё воедино
#define CREATE_CONTAINER(type, container, ...) \
(temporary_storage<type, \
sizeof((comma_counter<type, 0>::make(),__VA_ARGS__).to_ch_array())\
>::make().fill(), __VA_ARGS__).to_container<container>()
int main()
{
std::cout << COUNT_ARGS(int, 11, 22, 33) << '\n';
std::vector<int> v = CREATE_CONTAINER(int, std::vector<int>, 55, 66, 77, 88);
for (std::vector<int>::iterator i = v.begin(), e = v.end(); i != e; ++i)
std::cout << *i << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKLy8g0K3RgtCwINGI0YLRg9C60LAg0YfRgtC+0LHRiyDQv9C+0LvRg9GH0LjRgtGMINC60L7Qu9C40YfQtdGB0YLQstC+INGN0LvQtdC80LXQvdGC0L7QsiDQsiBfX1ZBX0FSR1NfXyDQutCw0LogY29tcGlsZS10aW1lINC60L7QvdGB0YLQsNC90YLRgwovLyDQuNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8g0LIgc2l6ZW9mINCy0YvRgNCw0LbQtdC90LjQuCwg0L/QvtGN0YLQvtC80YMg0L3QtSDRgtGA0LXQsdGD0LXRgtGB0Y8g0YDQtdCw0LvQuNC30LDRhtC40Y8g0LzQtdGC0L7QtNC+0LIKdGVtcGxhdGU8Y2xhc3MgVCwgc3RkOjpzaXplX3QgQ291bnQ+CnN0cnVjdCBjb21tYV9jb3VudGVyCnsKICAgIHN0YXRpYyBjb21tYV9jb3VudGVyPFQsIENvdW50PiBtYWtlKCk7CgogICAgY29tbWFfY291bnRlcjxULCBDb3VudCArIDE+IG9wZXJhdG9yLChUKTsKCiAgICB0eXBlZGVmIGNoYXIgY2hfYXJyYXlbQ291bnRdOwogICAgY2hfYXJyYXkmIHRvX2NoX2FycmF5KCk7Cn07CgojZGVmaW5lIENPVU5UX0FSR1ModHlwZSwgLi4uKSBzaXplb2YoKGNvbW1hX2NvdW50ZXI8dHlwZSwgMD46Om1ha2UoKSxfX1ZBX0FSR1NfXykudG9fY2hfYXJyYXkoKSkgCgovLyDQl9C00LXRgdGMINGF0YDQsNC90Y/RgtGB0Y8g0Y3Qu9C10LzQtdC90YLRiwp0ZW1wbGF0ZTxjbGFzcyBULCBzdGQ6OnNpemVfdCBDb3VudD4Kc3RydWN0IHRlbXBvcmFyeV9zdG9yYWdlCnsKICAgIFQgZGF0YVtDb3VudF07CgogICAgc3RhdGljIHRlbXBvcmFyeV9zdG9yYWdlPFQsIENvdW50PiBtYWtlKCkgeyByZXR1cm4gdGVtcG9yYXJ5X3N0b3JhZ2UoKTsgfQoKICAgIC8vINCt0YLQviDQt9Cw0L/QvtC70L3Rj9C10YIg0YXRgNCw0L3QuNC70LjRidC1CiAgICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBQb3M+CiAgICBzdHJ1Y3QgY29tbWFfZmlsbGVyCiAgICB7CiAgICAgICAgdGVtcG9yYXJ5X3N0b3JhZ2UmIHN0OwoKICAgICAgICBjb21tYV9maWxsZXIodGVtcG9yYXJ5X3N0b3JhZ2UmIHN0KSA6IHN0KHN0KSB7fQoKICAgICAgICBjb21tYV9maWxsZXI8UG9zICsgMT4gb3BlcmF0b3IsKFQgdCkKICAgICAgICB7CiAgICAgICAgICAgIHN0LmRhdGFbUG9zXSA9IHQ7CiAgICAgICAgICAgIHJldHVybiBjb21tYV9maWxsZXI8UG9zICsgMT4oc3QpOwogICAgICAgIH0KCiAgICAgICAgLy8g0JLRi9C00LDRkdGCINGA0LXQt9GD0LvRjNGC0LjRgNGD0Y7RidC40Lkg0LrQvtC90YLQtdC50L3QtdGACiAgICAgICAgdGVtcGxhdGU8Y2xhc3MgQ29udGFpbmVyPgogICAgICAgIENvbnRhaW5lciB0b19jb250YWluZXIoKSBjb25zdAogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIENvbnRhaW5lcihzdC5kYXRhLCBzdC5kYXRhICsgUG9zKTsKICAgICAgICB9CiAgICB9OwoKICAgIGNvbW1hX2ZpbGxlcjwwPiBmaWxsKCkgeyByZXR1cm4gY29tbWFfZmlsbGVyPDA+KCp0aGlzKTsgfQp9OwoKLy8g0JLRgdGRINCy0L7QtdC00LjQvdC+CgojZGVmaW5lIENSRUFURV9DT05UQUlORVIodHlwZSwgY29udGFpbmVyLCAuLi4pIFwKICAgICh0ZW1wb3Jhcnlfc3RvcmFnZTx0eXBlLCBcCiAgICBzaXplb2YoKGNvbW1hX2NvdW50ZXI8dHlwZSwgMD46Om1ha2UoKSxfX1ZBX0FSR1NfXykudG9fY2hfYXJyYXkoKSlcCiAgICA+OjptYWtlKCkuZmlsbCgpLCBfX1ZBX0FSR1NfXykudG9fY29udGFpbmVyPGNvbnRhaW5lcj4oKQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgQ09VTlRfQVJHUyhpbnQsIDExLCAyMiwgMzMpIDw8ICdcbic7CgogICAgc3RkOjp2ZWN0b3I8aW50PiB2ID0gQ1JFQVRFX0NPTlRBSU5FUihpbnQsIHN0ZDo6dmVjdG9yPGludD4sIDU1LCA2NiwgNzcsIDg4KTsKCiAgICBmb3IgKHN0ZDo6dmVjdG9yPGludD46Oml0ZXJhdG9yIGkgPSB2LmJlZ2luKCksIGUgPSB2LmVuZCgpOyBpICE9IGU7ICsraSkKICAgICAgICBzdGQ6OmNvdXQgPDwgKmkgPDwgJ1xuJzsKfQoK