cum se scrie o funcție care returnează un tip care este tipul de retur al sub-funcțiilor sale (Programare, C++)

user1461328 a intrebat.

Vreau să scriu o funcție care să apeleze mai multe subfuncții și să returneze rezultatul acestor subfuncții.

sub functions:
template<class A> A sub1(A a)
template<class B> B sub2(B b, int i)
template<class C> C sub3(C c, string p)

FUNCȚIA le va apela pe acestea în mod corespunzător în instrucțiunea switch. îmi pare rău că am doar pseudocod deoarece sunt confuz cu problema și nu încep să scriu codul.

mf(string s)
{
  int k;
  k = process(s)
  string
  switch (k){
  case 0:
    return sub1(k);
  case 1:
    return sub2(s, k);
  case 2:
    return sub3(k, s);
  default:
    break;
  }
}

Cum pot defini mf de mai sus din moment ce nu există un tip de retur pentru el acum? folosind din nou șablonul?Apropo, compilatorul meu c++ acceptă standardul c++ 11 cu care nu sunt atât de familiarizat.

Comentarii

  • Dacă sunt doar funcții simple, de ce este nevoie să folosiți șabloane? Mie mi se pare exagerat –  > Por FaddishWorm.
  • Ați putea returna un Boost.Variant, , ceea ce v-ar permite să returnați diferite tipuri și chiar un tip null pentru cazul de întrerupere (folosind boost::empty ca unul dintre tipuri. –  > Por Xeo.
2 răspunsuri
hpsMouse

C++ este practic un limbaj cu tipare statică, ceea ce înseamnă că toate tipurile de expresii sunt decise la compilare și nu la execuție.

Utilizarea tipării dinamice într-un limbaj cu tipare statică este posibilă, dar nu este recomandată pentru o utilizare pe scară largă. Pentru că în acest fel se renunță la aproape toate caracteristicile de polimorfism oferite de limbaj. Va trebui să verificați tipurile manual sau să implementați propriul polimorfism dinamic bazat pe tipuri.

Dacă datele returnate nu sunt prea complexe, structura etichetată este, de obicei, o idee bună:

struct Value
{
    enum {INT, FLOAT, PTR} type;
    union
    {
        int   int_data;
        float float_data;
        void *ptr_data;
    };
};

Pentru tipurile de date mai complexe, cu o mulțime de operații necesare pentru a fi suportate, ar trebui să luați în considerare utilizarea interfețelor abstracte și a moștenirii.

Dacă v-ați gândit serios la problemă și credeți că niciuna dintre aceste metode de mai sus nu se aplică problemei dumneavoastră și că tipizarea dinamică este cea mai bună cale, iată câteva opțiuni:

  • boost::any — Un container unic pentru toate tipurile. Necesitatea de a testa tipurile și de a le converti manual înainte de utilizare.

  • boost::variant — Un container de tip uniune care suportă operații polimorfe unitare prin boost::static_visitor.

  • Unele cadre de programare au propriul lor suport pentru tipărirea dinamică. Un exemplu este QVariant în Qt. Dacă vă aflați într-un astfel de cadru, de obicei este recomandat să le folosiți în locul a altceva dintr-o altă bibliotecă.

Comentarii

  • Vă mulțumim pentru răspunsul dvs. amabil. Așa cum am scris mai sus,vreau să scriu un interpretor pentru SCHEME în C++ în care expresia va fi evaluată la o valoare.valoarea poate fi un număr,un șir de caractere,o listă etc. care poate fi clară doar după evaluare. –  > Por user1461328.
  • @user1461328: Există doar câteva tipuri de bază în scheme, așa că aș prefera boost::any cu un tag. 🙂 –  > Por hpsMouse.
  • @user1461328: boost::any oferă o funcție type(), astfel încât tag-ul nu este necesar. Îmi pare rău pentru greșeala mea. Răspunsul a fost corectat. –  > Por hpsMouse.
ForceMagic

Dacă aveți nevoie de o funcție care returnează valoarea funcției sale secundare, aveți nevoie de același tip de returnare pentru toate.

Iată un mic exemplu fără sens:

double calculatedPositive(double value)
{
    // Do stuff
}

double calculatedNegative(double value)
{
    // Do stuff
}

double functionA(double value)
{
     if(value > 0)
         return calculatePositive(value);
     else
         return calculateNegative(value);
}

P.-S. Am putea să vă oferim un răspuns mai bun dacă ați spune ce încercați să obțineți 😉

Comentarii

  • De fapt vreau să scriu un interpret pentru SCHEME în C++ în care expresia va fi evaluată la o valoare care va fi folosită de o altă expresie. –  > Por user1461328.

Tags: