Я вижу две проблемы:
- аргумент шаблона
T
не выводится из типа аргументов (input
и type
).
Я понимаю, что вы намерены вывести его из значения типа, но это просто не работает в C ++.
Вы должны явно указать это, вызвав функцию ; например
parseInput<bool>(arg, type);
ваша функция имеет разные
return
s с разными типами. И они несовместимы.
До C ++ 17 (до if constexpr
) это невозможно.
В C ++ 17 это можно сделать, ( с if constexpr
, а не с switch
), но только если тест основан на известном значении времени компиляции.
Итак, если вы передадите type
в качестве параметра шаблона (если вы знаете его значение, скомпилируйте -time, очевидно) вы можете написать что-то как (внимание: код не протестирован)
template <CommandLineArgumentTypes type>
auto parseInput (std::string &input)
{
if constexpr ( CommandLineArgumentTypes::String == type )
return input;
else if constexpr ( CommandLineArgumentTypes::Int == type )
{
// do something else
}
else if constexpr ( CommandLineArgumentTypes::UInt == type )
return (unsigned int)std::stoi(input);
else if constexpr ( CommandLineArgumentTypes::Flag == type )
return true;
// else ?
}
Вызов становится, например,
parseInput<CommandLineArgumentTypes::UInt>(arg);
, но, повторяю, это может работать только если аргумент шаблона (старый type
) известен типом компиляции.