Estou tentando projetar uma função simples como esta:
void draw(Callback callback)
{
Drawing drawing("name");
callback(drawing);
std::cout << drawing.name() << std::endl;
}
onde drawing
deve ser passado para o retorno de chamada como referência, para que o chamador possa modificá-lo da seguinte forma:
draw([](auto& drawing) {
drawing.set_name("another name");
});
Agora isso funciona, porque estou digitando explicitamente o parâmetro de retorno de chamada como auto&
(ou Drawing&
). Porém, quando apenas digito o parâmetro como auto
(or Drawing
), o código também compila, mas não funciona mais conforme o esperado. A drawing
instância é copiada em vez de passada por referência.
Gostaria que o código não fosse mais compilado quando o parâmetro lambda não fosse digitado explicitamente como referência.
Eu tentei o seguinte:
using Callback = std::function<void(Drawing&)>;
:drawing
não é modificado quando não é digitado explicitamente comoauto&
.template<typename T> concept Callback = std::is_invocable<void, T, Drawing&>;
: o mesmo que acima.using Callback = void (*)(Drawing&);
: isso realmente funciona, mas perco a capacidade de usar a captura.
Então, como faço para digitar Callback corretamente para que apenas Drawing&
seja um parâmetro válido para o lambda?