Avatar billede krismort Nybegynder
04. januar 2006 - 12:48 Der er 4 kommentarer

templates og brug af void

Hej,
Jeg har gået og skumlet over et problem jeg har haft med templates i en ret advanceret løsning til at binde et script sprog sammen med c++ som jeg har lavet. Mit problem er at jeg har nogen metoder som retunerer void som skal bindes og nogen som retunerer int som skal bindes på forskellig måde fordi void ikke er en type. Spm er så om man kan omskring det flg. eksempel så det fungerer efter nogenlunde samme hensigt eller måske kan snyde parseren med på en eller anden måde eller bruge nogen præprocessor macroes istedet for?

class SomeClass {
public:
    SomeClass() {}
    void memberRetVoid() {
        return;
    }
    int memberRetInt() {
        return 0;
    }
};

template <typename TRet, class TClass >
bool isVoidReturn( TClass* ptr_class, TRet(TClass::*ptr_method)(void) ) {
    return false;
}
template <class TClass>
void isVoidReturn( TClass* ptr_class, void(TClass::*ptr_method)(void) ) {
    return true;
}


void main() {
    SomeClass c;
    // determine method
    isVoidReturn( &c, &SomeClass::memberRetInt );
    isVoidReturn( &c, &SomeClass::memberRetVoid );
    system("PAUSE");
}
Avatar billede bertelbrander Novice
04. januar 2006 - 20:18 #1
GCC, BorlandC og DMC kompilerer og giver det rette resultat for:
    std::cout << (isVoidReturn( &c, &SomeClass::memberRetInt ) ? "void" : "int") << std::endl;
    std::cout << (isVoidReturn( &c, &SomeClass::memberRetVoid ) ? "void" : "int") << std::endl;

VisualC++ 6.0 vil ikke kompile den anden linie :-( Men den er ikke kendt for at være særlig god til at overholde standarden, så jeg tror at det er de andre der har ret.

Men er det ikke lettere at få alle funktioner til at returnere en int?
Avatar billede krismort Nybegynder
04. januar 2006 - 21:04 #2
det var fandens :( jeg er desværre tvunget til at skulle bruge med msvc
Avatar billede bertelbrander Novice
04. januar 2006 - 21:38 #3
Du kan bruge typeid:

#include <iostream>
#include <string.h>

class SomeClass
{
public:
    SomeClass() {}
    void memberRetVoid()
    {
        return;
    }
    int memberRetInt()
    {
        return 0;
    }
};

template <typename TRet, class TClass >
const char *isVoidReturn( TClass* ptr_class, TRet(TClass::*ptr_method)(void) )
{
  return typeid(TRet).name();
}

int main()
{
    SomeClass c;
    // determine method
  std::cout << "IsVoid: " << (!strcmp(isVoidReturn(&c, &SomeClass::memberRetInt), "void") ? "true" : "false") << std::endl;
  std::cout << "IsVoid: " << (!strcmp(isVoidReturn(&c, &SomeClass::memberRetVoid), "void") ? "true" : "false") << std::endl;
}

Det er dog ikke alle compilere der returnerer "void" for void, men MSVC 6.0 gør.
Det kræver at du kører med RTTI
Avatar billede krismort Nybegynder
05. januar 2006 - 14:09 #4
weeee, jeg fandt et workaround. det her kan msvc ( 7.1 ) godt sluge :)

template <typename TRet, class TClass >
bool isVoidReturn( TRet(TClass::*ptr_method)(void), TClass* ptr_class ) {
    return false;
}
template <class TClass>
void isVoidReturn( void(TClass::*ptr_method)(void), TClass* ptr_class ) {
    return true;
}

Jeg kan desværre ikke bruge typeid fordi det skal fungerer på 'template niveau'.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester