Programim dhe zhvillim, javascript, python, php, html

Funksioni me tip kthimi auto

Po përpiqem të krijoj një lloj ndryshoreje të quajtur variant (si një lloj në VisualBasic) ku mund të ndryshojë llojet e variablave (jo në të vërtetë, por do të ndryshojë se cila do të kthehet). Këtu është kodi im:

#include <string>
using namespace std;

class Variant{
    private:
        int int_v;
        char char_v;
        bool bool_v;
        string string_v;

        char type;

    public:
        void set(int);
        void set(char);
        void set(bool);
        void set(string);

        auto get();

        Variant();
};

Variant::Variant(){
    int_v = 0;
    char_v = ' ';
    bool_v = false;
    string_v = "";
    type = ' ';
}

void Variant::set(int value){
    int_v = value;
    char_v = ' ';
    bool_v = false;
    string_v = "";
    type = 'i';
}

void Variant::set(char value){
    char_v = value;
    int_v = 0;
    bool_v = false;
    string_v = "";
    type = 'c';
}

void Variant::set(bool value){
    bool_v = value;
    int_v = 0;
    char_v = ' ';
    string_v = "";
    type = 'b';
}

void Variant::set(string value){
    string_v = value;
    int_v = 0;
    char_v = ' ';
    bool_v = false;
    type = 's';
}

auto Variant::get(){
    if(type == 'i') return int_v;
    else if(type == 'c') return char_v;
    else if(type == 'b') return bool_v;
    else if(type == 's') return string_v;
    else return -1;
}

int main(int argc, char *argv[]){

    return 0;
}

Ajo që supozohet të bëjë ky kod është diçka si kjo:

#include <iostream>
#include "Variant.h"
using namespace std;

int main(int argc, char *argv[]){

    Variant var;
    var.set(5); //set var to 5
    cout<<var.get()<<endl; //print var (5)
    var.set('a'); //set var to 'a'
    cout<<var.get()<<endl; //print var (a)
    var.set(true); //set var to true
    cout<<var.get()<<endl; //print var (true)
    var.set("Hello, World!"); //set var to "Hello, World!"
    cout<<var.get()<<endl; //print var (Hello, World!)

    return 0;
}

Por g++ më thotë:

Variant.h:17:12: error: ISO C++ forbids declaration of ‘get’ with no type [-fpermissive]
   auto get();
            ^
Variant.h:17:12: error: storage class specified for ‘get’

E gjithë ndihma vlerësohet! Faleminderit!

16.01.2015

  • Nuk është e mundur të ktheni një lloj tjetër me një përkufizim të vetëm funksioni. Përveç nëse është një shabllon. 16.01.2015
  • Ju ndoshta keni nevojë për një template dhe ndoshta dëshironi një union. 16.01.2015
  • A mund të më japë dikush një kod shembull? 16.01.2015
  • Një shembull gjendet në Boost.Variant por ai përfshin disa teknika më të avancuara. 16.01.2015
  • Çdo funksion ka një lloj kthimi fiks. auto thjesht e bën përpiluesin të përpiqet të deduktojë llojin e kthimit për ju. 16.01.2015
  • Si një shënim anësor, ajo që keni zbatuar nuk është në të vërtetë një variant, por më shumë një 4-tuple. Nëse dëshironi një variant, do t'ju duhet të përdorni një bashkim si 5gon12eder sugjeruar. 16.01.2015

Përgjigjet:


1

Lloji i kthimit duhet të jetë i zbritshëm në kohën e përpilimit, i ngjashëm me një parametër shabllon. Funksioni nuk mund të kthejë lloje të ndryshme në varësi të vetive të kohës së ekzekutimit, si p.sh. çfarë përmban varianti aktualisht.

Ju nuk keni vërtet shumë mundësi përveç variacioneve të:

template<typename T>
T get() const;

për të cilin do të duhet të specifikoni parametrin shabllon gjatë thirrjes. (Unë nuk shoh se çfarë fitohet duke kthyer një tuple dhe më pas duhet të telefononi get<int> për këtë gjithsesi...)

Këtu është kodi më i plotë i mostrës:

// In class definition
template<typename T> T get() const;

// Outside
template<> char   Variant::get<char>()   const { return char_v; }
template<> int    Variant::get<int>()    const { return int_v; }
template<> bool   Variant::get<bool>()   const { return bool_v; }
template<> string Variant::get<string>() const { return string_v; }
16.01.2015
  • Mund të ndani një kod pune ju lutem? Nuk mund ta bëja të funksiononte me shabllone... 16.01.2015
  • @mete ok, shtoi më shumë kod mostër. Ju mund të jeni në gjendje të përdorni auto si lloje të kthimit në C++14. 16.01.2015
  • Në ditët e sotme, ju mund të keni gjetur, nëse përpiloni me g++-5 *.cpp -o OUTPUT -std=c++14 07.12.2016

  • 2

    Deklaratat tuaja të kthimit në get po kthejnë lloje të ndryshme.

    Sipas këtu:

    Zbritja e tipit të kthimit të përgjithësuar tani funksionon edhe me trupa funksionesh më komplekse që përmbajnë më shumë se një deklaratë kthimi, për sa kohë që të gjitha deklaratat e kthimit kthejnë të njëjtin lloj.

    Redakto:

    Shihni përgjigjen e Matt McNabb për zgjidhjen e këtij gabimi me shabllone.

    16.01.2015
  • Pra, si mund të shkoj për marrjen e një funksioni për të kthyer lloje të ndryshme vlerash? 16.01.2015
  • Nuk është dashur ta bëj kurrë, kështu që nuk jam i sigurt, por përdorimi i shablloneve duhet ta bëjë. 16.01.2015
  • @CodyRichardson vetë ideja e një funksioni që kthen diçka...nuk jam i sigurt se shkon në kundërshtim me të gjithë gjuhën. 16.01.2015
  • @CodyRichardson: Nuk ka asnjë mënyrë për ta bërë këtë. Ajo që mund të provoni është të shtoni një mbingarkesë për futësin e transmetimit, i cili pranon një Variant. 16.01.2015
  • Në C++14, mund të përdorni std::tuple::get<T>, si në std::cout<< std::get<int>(var.get()) << std::endl;, e cila nuk kërkon numërimin e elementeve të dyfishtë ose në varësi të renditjes së llojit që nuk ndryshon kurrë. 16.01.2015
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..