Преобразование и удержание перегрузки на основе типа возврата - PullRequest
0 голосов
/ 16 октября 2018

Я видел в основных рекомендациях по С ++, что предпочтительно возвращать выходные значения из функций.

Я пытаюсь понять, удобно ли это для универсального кода.

Например,Чтобы преобразовать строку в определенное значение, я обычно делал бы что-то вроде:

template<class T>
T convertTo(const std::string& value)
  {
  // Do conversion
  return convertedValue;
  }

// Usage
convertTo<float>("test");

Без указания типа, который я бы сделал:

template<class T>
void convertTo(const std::string& value, T& outputValue)
  {
  // Do conversion
  // outputValue = convertedType
  }

// Usage
float myVar{};
convertTo("test", myVar);

Я знаю такжечто вы можете сделать что-то вроде:

auto convertTo(const std::string& value, anotherInputPerhaps) ->decltype(myexpression)
  {
  // get the type to return basing on anotherInputPerhaps
  return /*convertedValue*/
  }

Проблема здесь в том, как получить правильное преобразованное значение, возможно, без передачи какого-либо ввода или, возможно, с использованием значения по умолчанию.Это возможно?

Спасибо

[РЕДАКТИРОВАТЬ] В поисках чего-то, что не приводит к накладным расходам

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете возвратить класс с оператором преобразования, например:

struct Converter
{
    template <typename T>
    operator T() const /*&&*/ { /*Do conversion*/ return {}; }

    const std::string& s;
};

Converter convert(const std::string& value)
{
  return { value };
}

При использовании:

float f = convert("test");
int i = convert("test");
std::vector<int> v = convert("test");

Демо

0 голосов
/ 16 октября 2018

Со значением по умолчанию вы также можете сделать:

template<class T>
T convertTo(const std::string& value, T default_value)
{
   // DO Conversion
   if( conversion success)
     return convertedValue;
   else 
     return default_value;
}

И назвать его так:

float myVar= DEFAULT_VALUE;
myVar = convertTo("test", myVar);
...