To chyba przesada za przykład, ale jeśli naprawdę tylko trzeba przechowywać jeden układ na raz, a następnie można użyć klasy boost :: wariantowej i odwiedzającego np
#include <boost/variant.hpp>
#include <iostream>
template< typename T >
class GetVisitor : public boost::static_visitor<T>
{
public:
GetVisitor(int index) : index_(index) {};
template <typename U >
T operator() (U const& vOperand) const
{
return vOperand[index_];
}
private:
int index_;
};
int main()
{
int iArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
char cArr[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
boost::variant<int*, char*> intVariant(iArr); //- assign integer array to variant
boost::variant<int*, char*> charVariant(cArr); //- assign character array to another variant
int testInt = boost::apply_visitor(GetVisitor<int>(2), intVariant);
char testChar = boost::apply_visitor(GetVisitor<char>(9), charVariant);
std::cout << "returned integer is " << testInt << std::endl;
std::cout << "returned character is " << testChar << std::endl;
return 0;
}
output is:
returned integer is 3
returned character is j
ograniczenie wariantu domniemanych przez klasę GetVisitor jest to, że wszyscy członkowie wariantu musi implementować:
T operator[](int)
Więc można też dodać np std :: vector i std :: deque jako potencjalnych członków wariantu.
sposób, w jaki napisałeś, to nie jest możliwe, ponieważ nie ma nic "generycznego" na temat twojego kodu. Po prostu potrzebujesz selektora dla dwóch członków. Możesz po prostu użyć do tego zwykłego projektu klasy. Aby uzyskać coś naprawdę uniwersalnego, możesz spróbować boost.variant. –
Kerrek: To tylko prosty przykład.W moim rzeczywistym programie mam wiele więcej tablic specyficznych dla danego typu. Nie chcę pisać osobnych funkcji dla nich wszystkich. –
Czy wszystkie te tablice muszą być członkami twojej klasy? Byłoby to trudne, ponieważ klasy muszą być określone, ale jeśli masz tylko ograniczoną liczbę kontenerów, mam wrażenie, że szablony nie są tak naprawdę właściwą domeną problemu. –