Функция C ++ с переменным типом возвращаемого значения с использованием 'auto'

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

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. Ошибка при втором возврате: непоследовательный вывод для 'auto': 'int', а затем 'double'

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

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


person Moomin    schedule 08.01.2015    source источник
comment
Вывод типа возвращаемого значения работает только во время компиляции. Вам скорее нужно что-то вроде boost::any.   -  person πάντα ῥεῖ    schedule 08.01.2015
comment
Нет, так не работает. С auto компилятор будет выводить правильный тип возвращаемого значения, но он должен быть согласованным (если вы не хотите использовать _2 _...)   -  person Adriano Repetti    schedule 08.01.2015
comment
@AdrianoRepetti большое спасибо! Я совершенно забыл о QVariant - это должно сработать для меня.   -  person Moomin    schedule 08.01.2015


Ответы (2)


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

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

person aschepler    schedule 08.01.2015

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

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