Boost :: fusion kullanıyorum.Bir dizi sekansı (sekansların) düzleştirin
make_vector(1, make_vector('b', 3, make_vector(4, 5.5), "six"), 7, 8)
böyle bu
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]
yani dizisinin düzleştirilmiş versiyonu bir fonksiyon f üretmek istediği:
aşağıdaki gibi bir şey olması düşünelim.
Bu, özgün dizinin veya gerçek bir vektörün bir görünümü olup olmadığı umrumda değil.
GCC 4.5.1'de derleme yapabilmesi durumunda C++ 0x çözümüne aldırış etmem.
Not:
Ben veri öğelerini kısıtlamak için tercih ediyorum iken, eğer yardımcı olur, "veri" unsurları bütün ortak temel sınıf türetmek gerektirir çekinmeyin. yani
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); }
Sonra
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)
)
Ben o zaman "is_base_of" kullanarak veri elemanları ne olduğunu anlamaya çalışabilir.
WOW! Teşekkürler, bunu deneyeceğim ve daha yakından bakacağım. Bu, aradığım boost kaynak kodunun birçoğuna benziyor. Fikrimi Haskell versiyonundan da temel alıyordum, ancak enable_if'in derleme hataları olmadan doğru bir şekilde elde edilemediğini gördüm. – Clinton