, en iyi yolu bir tuple kullanmaktır. Başka önemli bir şey, onlara bazı adlandırılmış erişim elde etmek olabilir.Ben ne elde etmeye çalıştığınız benzersiz türleri ile birden vektörleri sahip olmaktır tahmin, bu yüzden değeri türüne göre doğru vektörü için "arama" için aşağıdaki özelliği barındırır:
İşte
template <class T1, class T2>
struct SameType
{
static const bool value = false;
};
template<class T>
struct SameType<T, T>
{
static const bool value = true;
};
template <typename... Types>
class MyClass
{
public:
typedef std::tuple<vector<Types>...> vtype;
vtype vectors;
template<int N, typename T>
struct VectorOfType: SameType<T,
typename std::tuple_element<N, vtype>::type::value_type>
{ };
template <int N, class T, class Tuple,
bool Match = false> // this =false is only for clarity
struct MatchingField
{
static vector<T>& get(Tuple& tp)
{
// The "non-matching" version
return MatchingField<N+1, T, Tuple,
VectorOfType<N+1, T>::value>::get(tp);
}
};
template <int N, class T, class Tuple>
struct MatchingField<N, T, Tuple, true>
{
static vector<T>& get(Tuple& tp)
{
return std::get<N>(tp);
}
};
template <typename T>
vector<T>& access()
{
return MatchingField<0, T, vtype,
VectorOfType<0, T>::value>::get(vectors);
}
};
olduğunu testcase bunu deneyebilirsiniz böylece: Eğer Sınıfım uzmanlaşmak geçirilen türleri listesinde olmayan herhangi bir türü kullanırsanız
int main(int argc, char** argv)
{
int twelf = 12.5;
typedef reference_wrapper<int> rint;
MyClass<float, rint> mc;
vector<rint>& i = mc.access<rint>();
i.push_back(twelf);
mc.access<float>().push_back(10.5);
cout << "Test:\n";
cout << "floats: " << mc.access<float>()[0] << endl;
cout << "ints: " << mc.access<rint>()[0] << endl;
//mc.access<double>();
return 0;
}
(çift için bu yorumladı aşımı erişimi bakınız), bir elde edersiniz derleme hatası, çok okunabilir değil, ama gcc en azından sorunun neden olduğu doğru yere işaret ediyor ve en azından böyle bir hata mesajı önerdi Sorunun doğru nedeni - Burada, örneğin, mc.access < çift >() yapmaya çalıştık eğer: Bir [ `std :: tuple`] olarak bağımsız değişken türleri iletebilirsiniz
error: ‘value’ is not a member of ‘MyClass<float, int>::VectorOfType<2, double>’
(http://en.cppreference.com/w/cpp/utility/tuple). –
Ayrı üyeler olmalı mı yoksa bir vektörler koleksiyonuna sahip olmak mı? Ör. Vektörlerin bir “std :: array”? [Bunu nasıl çözeceğimi bilmiyorum, ama bu soruya verdiğiniz cevap, bunu nasıl çözeceğimizi bilenlere yardımcı olabilir.] –
Koleksiyon da iyi. Buna yardım edeceğinden emin değilim. Bir noktada konteyner (std :: vektör) sadece türü bilmek gerekiyor. – user1101674