[C++11] Dedukcja parametru szablonu
Ostatnio zmodyfikowano 2013-08-22 13:55
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: #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 ); }
|
|
DejaVu |
» 2013-08-22 00:30:39 Dodam jeszcze, że Twój kod by się skompilował gdybyś napisał: 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: 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ś. |
|
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? |
|
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. |
|
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). |
|
1 « 2 » |