2015-01-16 2 views
0

Я пытаюсь создать переменный тип, называемый вариантом (вроде как в VisualBasic), где он может изменять типы переменных (на самом деле, но он изменит тот, который будет возвращен). Вот мой код:Функция с возвращаемым типом auto

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

Но г ++ говорит мне:

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’ 

Вся помощь ценится! Благодаря!

+4

Это невозможно вернуть другой тип с определением одной функции. Если это не шаблон. – BWG

+1

Вам, вероятно, нужен «шаблон», и вам, вероятно, нужен «союз». – 5gon12eder

+0

Может ли кто-нибудь дать мне пример кода? –

ответ

2

Тип возврата должен быть выведен во время компиляции, аналогично параметру шаблона. Функция не может возвращать разные типы в зависимости от свойств времени выполнения, таких как то, что в настоящее время содержит вариант.

Вы на самом деле не так много другого варианта, кроме вариаций:

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; } 
+0

Не могли бы вы поделиться рабочим кодом, пожалуйста? Я не мог заставить его работать с шаблонами ... – mty

+0

@mete ok, добавлено еще пример кода. Возможно, вы сможете использовать 'auto' в качестве возвращаемых типов в C++ 14. –

+0

Работал отлично, спасибо! – mty

1

Ваши операторы с возвратом в get возвращают разные типы.

По here:

Обобщенный тип возвращаемого вычет теперь работает даже с более сложными тела функций, содержащих более одного оператора возврата, до тех пор, как все возвращенные операторы возвращают один и тот же тип.

Редактировать: ответ

повидать Матта McNabb для решения этой ошибки с помощью шаблонов.

+0

Итак, как я могу получить функцию для возврата разных типов значений? –

+0

Никогда не приходилось это делать, поэтому я не уверен, но использовать шаблоны следует. – mty

+0

@CodyRichardson сама идея функции, которая возвращает «что-то ... я не уверен», противоречит всему языку. –

Смежные вопросы