Narzędzia użytkownika

Narzędzia witryny


tuple

To jest stara wersja strony!


Biblioteka Boost Tuple

Czasem w czasie pisania kodu zachodzi potrzeba zgrupowania kilku obiektów w jeden. Biblioteka standardowa implementuje szablon std::pair, który potrafi zgrupować dwa obiekty. Wraz z szablonem funkcji std::make_pair i operatorami porównywania szablon ten tworzy dość przydatne programiście narzędzi. Co w momencie gdy potrzebujemy takiego narzędzia do zgrupowania 3 i więcej wartości? Możemy pokusić się o napisanie własnej klasy bądź szablonu klas grupującego obiekty. O wiele wygodniej jednak skorzystać z gotowego rozwiązania jakie oferuje nam biblioteka Boost Tuple. Oferuje ona szablon boost::tuple pozwalający agregować do 10 elementów.

Tworzenie krotek

Do korzystanie z typu boost::tuple niezbędne jest załączenie do programu nagłówka „boost/tuple/tuple.hpp”. Aby utworzyć obiekt typu tuple należy podać typ obiektów wchodzących w skład krotki i opcjonalnie listę wartości początkowych o typach zgodnych z typami poszczególnych obiektów tworzących krotkę.

/* Tworzymy krotkę o trzech elementach. Wszystkie zostaną zainicjowane zerami. */
boost::tuple<int, int, double> foo; 
 
/* Krotka o trzech elementach jawnie zainicjowanych. */
boost::tuple<std::string, double, int> foo("Moja krotka", 29, 5);
 
/* Pozostałe obiekty zostaną zainicjowane domyślnie.*/
boost::tuple<std::string, double, int> foo("Moja krotka");

Jeśli jeden z elementów krotki nie udostępnia konstrukcji domyślnej konieczna jest jawna inicjalizacja.

class A  //Nasza klasa A
{
  private:
    A();   //Prywatny konstruktor domyślny
  public:
    A(int& i);  //Publiczny konstruktor
};
 
boost::tuple<A, A, A, A> foo;   //Błąd. Brak konstruktora domyślnego dla klasy A.
boost::tuple<A, A, A, A> foo(1, 2, 3, 4);  //Poprawne

Do tworzenia krotek możemy też użyć funkcji make_tuple, która utworzy krotkę na podstawie dedukcji typów podobnie jak robi to funkcja make_pair dla typu std::pair z biblioteki standardowej. Domyślnie make_tuple określa typy jako niereferencyjne i modyfikowalne (brak const). Jak to zmienić przeczytasz tutaj.

boost::make_tuple(10, "Moja krotka", 10.5);  //Tworzy krotkę na podstawie dedukcji typów

Dostęp do elementów krotki

Dostęp do elementów krotek możliwy jest dzięki metodzie get klasy tuple lub zewnętrznej wobec klasy funkcji get. Obie wymagają konkretyzacji indeksem elementu (oczywiście liczonym od zera). Obie też zwracają referencję do obiektu znajdującego się pod podanym indeksem.

boost::tuple<const int, int, int> foo(10, 20, 30);  //Tworzymy krotkę o 3 elementach
 
std::cout<<foo.get<2>();  //Wyświetli 30
std::cout<<boost::tuples::get<2>(foo);  //To samo działanie z użyciem zewnętrznej funkcji
 
const int& i=foo.get<0>();  //Dla wartości const lub krotek const zwracana jest referencja const
int& j=foo.get<0>();  //Błąd kompilacji
 
std::cout<<foo.get<5>();  //Błąd kompilacji. Rozmiar krotki 3.

Użycie zewnętrznej funkcji zamiast metody klasy uzależnia nasz kod od konkretnych nazw obiektów co może być niepożądane w rozwiązaniach uogólnionych.

Przypisywanie i kopiowanie krotek

Ciekawostki

Porównywanie krotek za pomocą operatorów relacji staje się dostępne po włączeniu "boost/tuple/tuple_comparison.hpp". Do korzystania z operacji wejścia-wyjścia na krotkach niezbędne jest dołączenie "boost/tuple/tuple_io.hpp". Podział biblioteki Tuple minimalizuje czas kompilacji. Jeśli nie potrzebujemy operatorów relacyjnych czy operacji wejścia-wyjścia nie ponosimy kosztu ich kompilacji.
tuple.1206993682.txt.gz · ostatnio zmienione: 2008/03/31 22:01 przez zegadlor