Tratando de hacer algo como ...
template <class T>
struct Wrapper
{
template <class U>
void set(const U& u) { myT = u; }
template <class F>
void set(F f) { myT = f(); }
T myT;
};
Sé que necesito usar SFINAE aquí, pero ¿cómo puedo distinguir un parámetro de devolución de llamada de un parámetro de valor? Es seguro asumir que un valor no puede usarse como devolución de llamada.
He tratado enable_if
con is_function, result_of
, invoke_result
, is_invocable
, y otros, pero nada de esto funciona bien. ¿Es posible?
constexpr
a SFINAE debido a mejores tiempos de compilaciónSí, puede aplicar SFINAE con la ayuda de
std::is_invocable
(desde C ++ 17).EN VIVO
fuente
La sobrecarga que toma una función como argumento se puede definir como:
Código demostrativo:
Salida:
fuente