簡體   English   中英

自動返回類型的功能

[英]Function with return type auto

我正在嘗試創建一個稱為variant的變量類型(類似於VisualBasic中的一種),它可以更改變量類型(不是真的,但是它將更改將返回的變量類型)。 這是我的代碼:

#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;
}

該代碼應該執行的操作是這樣的:

#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;
}

但是g ++告訴我:

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’

感謝所有幫助! 謝謝!

返回類型必須在編譯時可推導,類似於模板參數。 該函數不能根據運行時屬性(例如,變量當前包含的內容)返回不同的類型。

除了以下變化之外,您實際上沒有太多選擇:

template<typename T>
T get() const;

調用時必須為此指定模板參數。 (我看不到返回tuple然后必須調用get<int> ……)

這是更完整的示例代碼:

// 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; }

您在get中的return語句返回不同的類型。

根據這里

現在,即使所有返回語句返回相同類型,通用返回類型推論也可以用於包含多個return語句的更復雜的函數體。

編輯

有關使用模板解決此錯誤的信息,請參見Matt McNabb的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM