Tentando fazer 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;
};
Sei que preciso usar o SFINAE aqui, mas como faço para distinguir um parâmetro de retorno de chamada de um parâmetro de valor? É seguro assumir que um valor não pode ser usado como retorno de chamada.
Eu tentei enable_if
com is_function, result_of
, invoke_result
, is_invocable
, e outros, mas nada disso funciona direito. Isso é possível?
constexpr
o SFINAE por causa dos melhores tempos de compilação #Sim, você pode aplicar o SFINAE com a ajuda de
std::is_invocable
(desde C ++ 17).VIVER
fonte
A sobrecarga que assume uma função como argumento pode ser definida como:
Código demonstrativo:
Resultado:
fonte