7 lutego 2013

Detekcja typu (C++11) - auto i decltype

W nowym standardzie, możemy zlecić kompilatorowi wykrycie używanego przez nas typu. Służy do tego słowo kluczowe auto. Jest to szczególnie użyteczne dla typów zbudowanych przy pomocy szablów, które mogą być bardzo skomplikowane w czytaniu i zapisie. Uwaga! auto usuwa modyfikatory const i volatile, nowy wydedukowany typ nie będzie ich już posiadał.
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v = {1, 2, 4, 6};
    auto vit = v.begin();
    cout << *vit << endl;
    return 0;
}
Drugim ficzerem jest detekcja typu przy pomocy decltype. Na podstawie zadanej zmiennej lub wyrażenia odgaduje typ, który będzie nadany nowej zmiennej. W przypadku wyrażenie, nie dochodzi do ewaluacji, wyciągany jest jedynie zwracany typ. Warto też pamiętać, że jeżeli wsadzimy do decltype zmienną i ujmiemy ją w dodatkowe nawiasy, typ który dostaniemy zawsze będzie referencją, a nowa zmienna będzie musiała być zainicjalizowana. Jeżeli natomiast z nawiasów nie skorzystamy to referencję uzyskamy tylko, gdy sama zmienna będzie typem referencyjnym.
#include <iostream>
#include <vector>
#include <list>
#include <boost/type_index.hpp>

using namespace std;

list<double>::iterator get_it(list<double> l)
{
    return l.begin();
}

int main()
{
    list<double> l = {7.1, 2.3, 4.6};
    decltype(get_it(l)) it = get_it(l); // list<double>::iterator it =  get_it(l);
    cout << boost::typeindex::type_id_with_cvr<decltype(it)>().pretty_name() << " " << *it << endl;

    int i = 879;
    decltype((i)) var1 = i;  // int& var1 = i;
    cout << boost::typeindex::type_id_with_cvr<decltype(var1)>().pretty_name() << " " << var1 << endl;

    int& j = i;
    decltype(j) var2 = i;    // int& var2 = i;
    cout << boost::typeindex::type_id_with_cvr<decltype(var2)>().pretty_name() << " " << var2 << endl;

    decltype(i) br = 54;     // int br = 54;
    cout << boost::typeindex::type_id_with_cvr<decltype(br)>().pretty_name() << " " << br << endl;

    return 0;
}
Wyniki:
std::_List_iterator<double> 7.1
int& 879
int& 879
int 54

Brak komentarzy:

Prześlij komentarz