[英]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.