return 类型 auto 的函数

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’

感谢所有帮助!谢谢!

您在 get 中的 return 语句是 return 不同的类型。

根据here

Generalized return type deduction now works even with more complex function bodies containing more than one return statement, as long as all return statements return the same type.

编辑

请参阅 Matt McNabb 关于使用模板解决此错误的回答。

return 类型必须在编译时可推导,类似于模板参数。该函数不能 return 不同类型,具体取决于 运行 时间属性,例如变体当前包含的内容。

除了以下的变体,你真的没有太多选择:

template<typename T>
T get() const;

调用时必须指定模板参数。 (我看不出 returning a 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; }