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.

questionAnswers(3)

yourAnswerToTheQuestion