2015-01-08 4 views
3

Я пытаюсь написать функцию, которая возвращает различные типы в зависимости от оператора if.Функция C++ с переменным возвращаемым типом с использованием «auto»

auto parseParameterValue(QString aParameterValueString, int aParameterType) 
{ 
    if(aParameterType == 0) 
    { 
     int result = aParameterValueString.toInt(); 
     return result; 
    } 
    else if(aParameterType == 1) 
    { 
     double result = aParameterValueString.toDouble(); 
     return result; // <------- compilation error 
    } 
    else 
    { 
     return aParameterValueString; 
    } 
} 

К сожалению, то, что я получаю:

  1. Внимание: функция 'parseParameterValue' использует 'Auto' спецификатора типа без закрывающего типа возвращаемого значения
  2. Ошибки при втором возвращении: противоречивый вывод для «авто ':' int ', а затем' double '

Есть ли способ заставить его работать?

Заранее спасибо.

+1

Возврат типа вычитания работает только во время компиляции. Вам нужно нечто вроде 'boost :: any'. –

+5

Нет, это не работает. С 'auto' ** компилятор ** выведет правильный тип возврата, но он должен быть последовательным (если вы не хотите идти с' QVariant' ...) –

+1

@AdrianoRepetti благодарит! Я полностью забыл о «QVariant», который должен работать для меня. – Moomin

ответ

10

Нет, функция может иметь только один тип возврата.

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

3

Вы можете вернуть тип стирания, например boost::any, который может хранить любой тип. Тогда ваш код будет выглядеть так:

boost::any parseParameterValue(QString aParameterValueString, int aParameterType) 
{ 
    switch(aParameterType) { 
    default: return {aParameterValueString}; 
    case 0: return {aParameterValueString.toInt()}; 
    case 1: return {aParameterValueString.toDouble()}; 
    } 
}