Inferir a assinatura de chamada de um lambda ou arbitrário para "make_function"
Em algumas situações, é desejável poder apagar uma chamada (por exemplo, função, ponteiro de função, instância de objeto comoperator()
lambdamem_fn
), por exemplo emUsando adaptadores Boost com lambdas C ++ 11 onde é necessário um tipo de cópia designável e construtível por padrão.
std::function
seria ideal, mas parece que não há comoautomaticamente determinar qual assinatura para instanciar o modelo de classestd::function
com. Existe uma maneira fácil de obter a assinatura de função de um callable arbitrário e / ou envolvê-lo em um apropriadostd::function
instância de instanciação (isto é,make_function
modelo de função)?
Especificamente, estou procurando um ou outro
template<typename F> using get_signature = ...;
template<typename F> std::function<get_signature<F>> make_function(F &&f) { ... }
de tal modo quemake_function([](int i) { return 0; })
retorna umstd::function<int(int)>
. Obviamente, isso não seria esperado se uma instância fosse chamada com mais de uma assinatura (por exemplo, objetos com mais de um, modelo ou parâmetro padrão).operator()
s).
Boost é bom, embora soluções não-Boost que não sejam excessivamente complexas sejam preferidas.
Edit: respondendo a minha própria pergunta.