template<class F,
class R=std::result_of_t<F&()>,
std::enable_if_t<std::is_convertible<R,int>{}&&(!std::is_convertible<R,float>{}||std::is_integral<R>{}),int> =0
>
A(F&&f):A(std::function<int()>(std::forward<F>(f))){}
template<class F,
class R=std::result_of_t<F&()>,
std::enable_if_t<std::is_convertible<R,float>{}&&(!std::is_convertible<R,int>{}||std::is_floating_point<R>{}, int> =0
>
A(F&&f):A(std::function<float()>(std::forward<F>(f))){}
A(std::function<int()> f) { f_ = f; }
A(std::function<float()> g) { g_ = g; }
Здесь мы неоднозначные случаи, и отправку интегральных к перегрузке INT, и не плавающий к поплавку один.
Случаи, когда они конвертируются в оба, но ни с плавающей точкой, ни с интегралом, остаются двусмысленными. Как и должно быть.
Предложение sfina может быть сложным. Если он не работает, замените:
std::enable_if_t<std::is_convertible<R,float>{}&&(!std::is_convertible<R,int>{}||std::is_floating_point<R>{}, int> =0
С
class=std::enable_if_t<std::is_convertible<R,float>{}&&(!std::is_convertible<R,int>{}||std::is_floating_point<R>{}>
и аналогичные для других CTOR. Это может работать в MSVC например.
Полный по тегу диспетчеризации может потребоваться для MSVC, из-за отсутствие экспрессии SFINAE в 2015 году
Но это работает, когда я использую другой тип возвращаемого значения для шаблона функции (например, тип указателя) – mak
Связанные: HTTP: //переполнение стека.com/questions/22542780/c11-auto-stdfunction-and-twoiguous-call-to-overloaded-function – 101010
Что вы пытаетесь сделать? Возможно, начиная с этого было бы лучше здесь. Например, вы можете сохранить как '[]() -> int', так и' []() -> float' в 'function()>'. Затем, вызывая его, вы можете получить результат с помощью 'boost :: apply_visitor (a.f(), [] (auto x) {...})' –