Я не думаю, что возможно автоматическое определение типа возврата в std::function
.
Если вам нужно сохранить лямбда / функтор, который вызывает функцию std::sto*
, я придумал с некоторыми альтернативами. Просто создайте сам шаблон и замените им auto
. Это позволяет удалить параметр типа const std::string&
.
#include <type_traits> // for std::is_same
template <typename T = int>
constexpr std::function<T(const std::string)> create()
{
if (std::is_same<T, int>::value)
{ return [&](const std::string &value) { return std::stoi(value); }; }
if (std::is_same<T, float>::value)
{ return [&](const std::string &value) { return std::stof(value); }; }
throw std::runtime_error("");
}
Или вы можете создать класс функтора самостоятельно.
#include <type_traits> // for std::is_same
template <typename T = int>
struct Functor {
T operator()(const std::string& input) {
if (std::is_same<T, int>::value) { return std::stoi(input); };
if (std::is_same<T, float>::value) { return std::stof(input); };
throw std::runtime_error("");
}
};
Использование для вышеуказанного.
int main() {
auto f_i = create();
auto f_f = create<float>();
f_i("42"); // returns an int
f_f("3.14"); // returns a float
Functor fo_i;
Functor<float> fo_f;
fo_i("42"); // returns an int
fo_f("3.14"); // returns a float
}
Я бы посоветовал просто вызвать правильную функцию преобразования numeri c вместо сохранения лямбда / функтора, вызывающего std::sto*
, было бы лучшим подходом.