2009-08-08 7 views
0

J'ai cette chaîne générique à la conversion du numéro:Comment mettre std :: dec/hex/oct en consultation tableau

enum STRING_BASE : signed int { 
     BINARY = -1, 
     OCTAL = 0, 
     DECIMAL = 1, 
     HEX  = 2, 
    }; 
    template <class Class> 
    static bool fromString(Class& t, const std::string& str, STRING_BASE base = DECIMAL) { 
     if (base == BINARY) { 
      t = (std::bitset<(sizeof(unsigned long)*8)>(str)).to_ulong(); 
      return true; 
     } 
     std::istringstream iss(str); 
     std::ios_base& (*f)(std::ios_base&); /// have no idea how to turn this into a look-up array 
     switch (base) { 
      case OCTAL:  f = std::oct; break; 
      case DECIMAL: f = std::dec; break; 
      case HEX:  f = std::hex; break; 
     } 
     return !(iss >> f >> t).fail(); 
    }; 

je voudrais tourner le commutateur cas dans un regard bien -up tableau, quelque chose le long de ces lignes:

std::ios_base arr[2] = {std::oct, std::dec, std::hex}; 
    return !(iss >> arr[(int)base] >> t).fail(); 

Ce produit: * erreur C2440: 'initialisation': ne peut pas convertir 'std :: ios_base & (__cdecl ) (std :: ios_base &)' à ' std :: ios_base '

Cela ne fonctionnera pas non plus:

std::ios_base& arr[2] = {std::oct, std::dec, std::hex}; 

Je reçois: erreur C2234: 'arr': tableaux de références sont illégales

Alors, est-il une solution à ce problème?

Répondre

2

Essayez:

std::ios_base& (*arr[])(std::ios_base&) = { std::oct, std::dec, std::hex }; 

Ou avec typedef pour le pointeur de fonction:

typedef std::ios_base& (*ios_base_setter)(std::ios_base&); 

ios_base_setter arr[] = { std::oct, std::dec, std::hex }; 

Vous pouvez omettre la taille du tableau, il sera deteremined du nombre des initialisations. J'ai remarqué cela parce que vous avez spécifié un tableau de taille 2, mais fourni 3 initialiseurs.

Questions connexes