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

Warunki z typeid

Ostatnio zmodyfikowano 2015-05-07 16:12
Autor Wiadomość
TheReclif
Temat założony przez niniejszego użytkownika
Warunki z typeid
» 2015-05-04 22:23:04
Witam!
Ostatnio napisałem metodę, która miała ną podstawie typu przypisać wartość jednego z argumentów odpowiedniej składowej. Kod:
C/C++
template < typename type >
void taskMgr::setArg( type arg, string context )
{
   
    if( typeid( arg ) == HCURSOR )
    {
        cursor = arg;
        return;
    }
    if( typeid( arg ) == HICON )
    {
        icon = arg;
        return;
    }
    if( typeid( arg ) == LPCSTR )
    {
        if( context == CONTEXT_WINDOW_NAME )
        {
            winName = arg;
            return;
        }
    }
    if( typeid( arg ) == systemSettings )
    {
        winSetts = arg;
        return;
    }
}
Kompilator wywala przy tym kodzie błędy.
Czy to, co pragnę zrobić można napisać bez błędów?
P-131778
DejaVu
» 2015-05-04 23:00:33
Logi kompilacji się wkleja...

http://en.cppreference.com/w​/cpp/language/typeid

Sprawdź:
C/C++
template < typename type >
void taskMgr::setArg( type arg, string context )
{
   
    if( typeid( arg ) == typeid( HCURSOR ) )
    {
        cursor = arg;
        return;
    }
    if( typeid( arg ) == typeid( HICON ) )
    {
        icon = arg;
        return;
    }
    if( typeid( arg ) == typeid( LPCSTR ) )
    {
        if( context == CONTEXT_WINDOW_NAME )
        {
            winName = arg;
            return;
        }
    }
    if( typeid( arg ) == typeid( systemSettings ) )
    {
        winSetts = arg;
        return;
    }
}
P-131781
Monika90
» 2015-05-05 09:23:10
Tak się nie da tego zrobić, a to dlatego, że C++ jest językiem ze statyczną kontrolą typów. C++ to nie Python. Można uzyskać efekt o jaki Ci chodzi przeciążając funkcję:
C/C++
void setArg( HCURSOR arg, string context );
void setArg( HICON arg, string context );
void setArg( PCSTR arg, string context );
void setArg( systemSettings arg, string context );
P-131789
kubawal
» 2015-05-05 17:46:16
@up albo specjalizując szablon.

/edit: Poza tym wszystkie windowsowe Hcośtam sprowadzają się do HANDLE czyli do PVOID czyli do void *
Czyli HCURSOR, HICON itd. to tak naprawde te same typy więc nie można przeciążyć dla nich funkcji ani wyspecjalizowac szablonu

C/C++
typeid( arg ) == HCURSOR
Gdyby tak się dało w C++...
P-131797
pekfos
» 2015-05-05 19:50:12
Poza tym wszystkie windowsowe Hcośtam sprowadzają się do HANDLE czyli do PVOID czyli do void *
Nie.
P-131800
kubawal
» 2015-05-06 15:48:45
@up Sprawdź na msdn
P-131808
Monika90
» 2015-05-06 17:30:04
No tak, akurat HICON i HCURSOR to ten sam typ. Ale większość uchwytów to jednak różne typy.
P-131817
Fireho
» 2015-05-06 18:11:49
@kubawal @Monika90
HICON
 i
HCURSOR
 mogą być tym samym typem, ale nie muszą - zależy to od obecności jakiegoś makra
_MAC
. Ale fakt, reszta uchwytów to zupełnie różne typy.
P-131818
« 1 » 2
  Strona 1 z 2 Następna strona