Por que a função std :: tr1 :: funciona com blocos Objective-C?

9

Fiquei bastante surpreso quando descobri que o seguinte código realmente funciona:

std::vector<int> list /*= ...*/;
std::tr1::function<void(int)> func = ^(int i) {
  return i + 1;
};

std::for_each(list.begin(), list.end(), func);

Parece que std::tr1::function é capaz de ser construído a partir de um bloco Objective-C, mas não tenho certeza de como, desde que (pela última vez que verifiquei), sua implementação não lida especificamente com blocos. É de alguma forma implicitamente sugando o ponteiro de função subjacente? Além disso, esse comportamento é indefinido e provavelmente mudará?

    
por Jonathan Sterling 09.04.2011 в 21:31
fonte

2 respostas

5

Atualização: eu estava errado, eis por que isso realmente funciona

O parâmetro de template

std::tr1::function simplesmente define a assinatura do objeto de função resultante, não o tipo que ele realmente envolve. Assim, o objeto empacotado só precisa oferecer uma operator() com assinatura correspondente. Referências de bloco, como ponteiros de função, têm tal operator() implicitamente (obviamente, então você pode chamá-las).

Resposta antiga e incorreta (para que os comentários façam sentido)

Suspeito que funcione porque o bloco não captura nenhuma variável do escopo ao redor. Nesse caso, não há estado para manter, portanto, uma referência de bloco pode ser representada como um ponteiro de função simples. Se mudarmos o código para

std::vector<int> list /*= ...*/;
int counter = 0;
std::tr1::function<void(int)> func = ^(int i) {
  counter++;
  return i + counter;
};

std::for_each(list.begin(), list.end(), func);

ele deve falhar na compilação, já que o bloco deve carregar o valor capturado de counter com ele. (a menos que a implementação de std::tr1::function tenha sido especificamente atualizada para suportar blocos)

    
por pmdj 17.04.2011 / 11:34
fonte
0

Embora você possa tratar blocos como objetos Objective-C e o Objective-C tenha muito suporte para blocos, os blocos não estão limitados a Objective-C. Você também pode usar blocos em C e C ++. Veja este artigo para mais informações.

    
por Caleb 17.04.2011 / 17:07
fonte