Я использую boost :: fusion.Сгладить последовательность последовательностей (последовательностей)
Допустим, у меня есть что-то вроде следующего:
make_vector(1, make_vector('b', 3, make_vector(4, 5.5), "six"), 7, 8)
Я хочу, чтобы произвести функцию F такой, что
f(make_vector(1, make_vector('b', 3, make_vector(4, 5.5), "six"), 7, 8))
-> [1, 'b', 3, 4, 5.5, "six", 7, 8]
т.е. уплощенным версии последовательности.
Я не возражаю, если это представление исходной последовательности или фактического вектора.
Я не против решения в C++ 0x, если он может компилироваться в GCC 4.5.1.
Примечание:
Хотя я бы предпочел, чтобы не ограничивать элементы данных, если это помогает, не стесняйтесь требовать, чтобы элементы «данных» все происходят от общего базового класса.
т.е.
class DataBase {}
template <class T>
class Data : public DataBase
{
public:
Data(const T& x) : m_x(x)
T m_x;
}
template <class T>
T make_data(const T& x) { return Data<T>(x); }
Тогда
make_vector(
make_data(1),
make_vector(
make_data('b'),
make_data(3),
make_vector(
make_data(4),
make_data(5.5)
),
make_data("six")
),
make_data(7),
make_data(8)
)
Я полагаю, то вы можете работать, какие элементы данных с помощью "is_base_of".
WOW! Спасибо, я попробую это и поближе посмотрю. Это очень похоже на некоторый код исходного кода, который я просматривал. Я также основывал свою идею на версии Haskell, но я не мог получить права на включение без ошибок компиляции. – Clinton 2010-12-07 12:24:34