No C ++ 11, existe uma maneira de modelar uma função lambda? Ou é inerentemente específico demais para ser modelado?
Entendo que posso definir uma classe / functor com modelo clássico, mas a pergunta é mais como: a linguagem permite modelar funções lambda?
Respostas:
ATUALIZAÇÃO 2018: O C ++ 20 virá com lambdas modeladas e conceituadas. O recurso já foi integrado ao rascunho padrão.
ATUALIZAÇÃO 2014: O C ++ 14 foi lançado este ano e agora fornece aos lambdas polimórficos a mesma sintaxe que neste exemplo. Alguns grandes compiladores já o implementam.
Do jeito que está (em C ++ 11), infelizmente não. Lambdas polimórficas seriam excelentes em termos de flexibilidade e potência.
A razão original pela qual eles acabaram sendo monomórficos foi por causa de conceitos. Os conceitos dificultaram a situação do código:
Em um modelo restrito, você pode chamar apenas outros modelos restritos. (Caso contrário, as restrições não poderão ser verificadas.) Pode
foo
invocarbar(x)
? Quais restrições o lambda possui (afinal, o parâmetro para ele é apenas um modelo)?Os conceitos não estavam prontos para lidar com esse tipo de coisa; exigiria mais coisas como
late_check
(onde o conceito não foi verificado até ser invocado) e outras coisas. Mais simples era apenas largar tudo e seguir as lambdas monomórficas.No entanto, com a remoção de conceitos do C ++ 0x, lambdas polimórficas se tornam uma proposição simples novamente. No entanto, não consigo encontrar nenhuma proposta para isso. :(
fonte
Os lambdas do C ++ 11 não podem ser modelados conforme indicado em outras respostas, mas
decltype()
parecem ajudar ao usar um lambda em uma classe ou função modelada.Impressões:
Descobri que essa técnica é útil ao trabalhar com código de modelo, mas percebo que ainda significa que as próprias lambdas não podem ser de modelo.
fonte
T
funcionaria bem no lugardecltype(t)
deste exemplo.No C ++ 11, as funções lambda não podem ser modeladas, mas na próxima versão do ISO C ++ Standard (geralmente chamado C ++ 14), esse recurso será introduzido. [Fonte]
Exemplo de uso:
Observe que, embora a sintaxe use a palavra-chave
auto
, a dedução de tipo não usará as regras deauto
dedução de tipo, mas as regras de dedução de argumento do modelo. Consulte também a proposta de expressões lambda genéricas (e a atualização para isso).fonte
auto
dedução de tipo são definidas especificamente para serem as mesmas datemplate
dedução de argumento de função.Estou ciente de que esta pergunta é sobre C ++ 11. No entanto, para aqueles que pesquisaram e pousaram nesta página, os lambdas modelados agora são suportados no C ++ 14 e têm o nome de Lambdas genéricos.
[info] A maioria dos compiladores populares suporta esse recurso agora. Microsoft Visual Studio 2015 suporta. Clang suporta. GCC suporta.
fonte
Gostaria de saber o que sobre isso:
Eu usei código semelhante como este, para gerar um modelo e me perguntar se o compilador otimizará a função "quebra automática".
fonte
Dê uma olhada no Boost.Phoenix para lambdas polimórficas: http://www.boost.org/doc/libs/1_44_0/libs/spirit/phoenix/doc/html/index.html Não requer C ++ 0x, pelo maneira :)
fonte
Há uma extensão gcc que permite modelos lambda :
onde
_widgets
é umstd::tuple< fusion::pair<Key_T, Widget_T>... >
fonte
Eu tenho jogado com a última
version 5.0.1
compilação de clang com a-std=c++17
bandeira e agora existe um bom suporte para parâmetros de tipo automático para lambdas:fonte
Aqui está uma solução que envolve envolver o lamba em uma estrutura:
Para usar faça:
O principal problema com isso (além da digitação extra) você não pode incorporar essa definição de estrutura em outro método ou obter (gcc 4.9)
Eu também tentei fazer isso:
Com a esperança de poder usá-lo assim:
Mas eu recebo o erro do compilador:
Portanto, isso não funciona ... mas mesmo que fosse compilado, seria de uso limitado, porque ainda precisaríamos colocar o "using LamdaT" no escopo do arquivo (porque é um modelo) que meio que derrota o objetivo de lambdas.
fonte
Não sei por que mais ninguém sugeriu isso, mas você pode escrever uma função de modelo que retorna funções lambda. A seguir, resolvi meu problema, o motivo pelo qual vim a esta página:
Agora, sempre que eu quero uma função que aceita um determinado tipo de argumento (por exemplo
std::string
), eu apenas digoe agora
f("any string")
retorna1.0
.Esse é um exemplo do que quero dizer com "função lambda modelada". (Esse caso específico é usado para fornecer automaticamente uma função de ponderação inerte quando alguém não deseja ponderar seus dados, quaisquer que sejam seus dados.)
fonte