Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++11] Dedukcja parametru szablonu

Ostatnio zmodyfikowano 2013-08-22 13:55
Autor Wiadomość
Monika90
» 2013-08-22 00:26:32
Dedukcja typów nie działa dla parametrów postaci xyz<T>::type, a parametr const shared_ptr_type<U>& taką właśnie ma postać (po rozwinięciu aliasu). Jeżeli zastąpić const shared_ptr_type<U>& przez const std::shared_ptr<U>& to zadziała.

Jeżeli zamiast namiastki template-typedef w stylu C++98 użyje się C++11 to też zadziała:
C/C++
#include <type_traits>
#include <memory>

template < typename T >
using shared_ptr_type = std::shared_ptr < T >;

template < class T, class U >
inline shared_ptr_type < T > shared_ptr_type_static_cast( const shared_ptr_type < U >& r )
{
    return std::static_pointer_cast < T >( r );
}

class A { };
class B
    : public A
{ };

int main() {
    shared_ptr_type < A > b( new B() );
    shared_ptr_type < B > c = shared_ptr_type_static_cast < B >( b );
}
P-90741
DejaVu
» 2013-08-22 00:30:39
Dodam jeszcze, że Twój kod by się skompilował gdybyś napisał:
C/C++
shared_ptr_type < B > c = shared_ptr_type_static_cast < B, A >( b );
Automatyczna dedukcja natomiast wykrywa, że b jest typu shared_ptr_type < A >, więc podstawia za drugi parametr wspomnianą frazę, czyli:
C/C++
shared_ptr_type < B > c = shared_ptr_type_static_cast < B, shared_ptr_type < A > >( b );
i tu już widać wyraźnie błąd jaki popełniłeś.
P-90742
Elaine
» 2013-08-22 00:44:10
Ale dedukcja tu w ogóle nie zachodziła, z powodu podanego przez Monikę.

Ten kod jest przekombinowany, po co ten cały cyrk ze smart_ptr_types?
P-90743
b00rt00s
Temat założony przez niniejszego użytkownika
» 2013-08-22 13:53:48
Ten kod jest przekombinowany, po co ten cały cyrk ze smart_ptr_types?
Oczywiście, że jest :D. Zwyczajnie eksperymentuje sobie, żeby się nauczyć pewnych mechanizmów. To nie mało mieć żadnego zastosowania.
P-90749
DejaVu
» 2013-08-22 13:55:58
Ok, to skoro problem jest rozwiązany to temat zamykam - jak będziesz robił jeszcze jakieś eksperymenty z C++11 to podziel się nimi na forum (te udane eksperymenty też są interesujące).
P-90751
1 « 2 »
Poprzednia strona Strona 2 z 2