utilização do impulso: ref para passar referência a funções que tomam valores
Estou confuso sobre o uso de impulso:: ref. Não percebo porque é que alguém quereria fazer o seguinte ...
void f(int x)
{
cout << x<<endl;
x++;
}
int main(int argc, char *argv[])
{
int aaa=2;
f(boost::ref(aaa));
cout << aaa<<endl;
exit(0);
}
Qual é a utilidade de passar um ref para uma função. Posso sempre passar pelo valor. Também não é que o árbitro seja realmente aprovado. No acima, o valor de aaa em geral permanece apenas 2.
Onde é que o boost ref é útil?é possível usar impulso:: ref neste cenário. I want to pass iterator refernce to std:: sort function. normalmente a o sort funciona em cópias iterator - irá aumentar:: ref fazê-lo funcionar para referências também? (sem quaisquer alterações na DST::sort)
2 answers
Não percebo porque é que alguém quereria fazer o seguinte.Não é para isso que serve. Se uma função toma um argumento por valor, então não há maneira de forçá-la a tomá-lo por referência em vez disso.
Onde é que o boost ref é útil?
Pode ser usado para fazer uma função template agir como se tomasse um argumento por referência, instanciando o template para a referência (embalagem) tipo, em vez do tipo de valor:
template <typename T>
void f(T x) {++x;}
f(aaa); cout << aaa << endl; // increments a copy: prints 0
f(ref(aaa)); cout << aaa << endl; // increments "a" itself: prints 1
Um uso específico comum é para argumentos de ligação às funções:
void f(int & x) {++x;}
int aaa = 0;
auto byval = bind(f, aaa); // binds a copy
auto byref = bind(f, ref(aaa)); // binds a reference
byval(); cout << aaa << endl; // increments a copy: prints 0
byref(); cout << aaa << endl; // increments "a" itself: prints 1
É possível usar impulso:; ref neste cenário. I want to pass iterator refernce to std:: sort function. normalmente o sort funciona em cópias iterator - irá aumentar:: ref fazê-lo funcionar para referências também?
Não; o invólucro de referência não satisfaz os requisitos do iterador, por isso não pode usá-lo em algoritmos padrão. Se pudesses, então ... muitos algoritmos iriam horrivelmente mal se eles precisassem fazer cópias independentes de iteradores (como muitos, incluindo a maioria das implementações sort
, devem fazer).
A Biblioteca Ref é uma pequena biblioteca que é útil para passar referências a Modelos de funções (algoritmos) que usualmente tirariam cópias de seus argumentos.
No seu primeiro exemplo, void f(int)
não é um modelo de função, por isso não há efeito: um Anonymous temporary boost::reference_wrapper<int>
é criado e imediatamente convertido de volta para um int&
que é então dizerferenciado para passar um int
para a sua função. Esperemos que o compilador rejeite todo este disparate, uma vez que não tem qualquer efeito.
Dizes:
O que é verdade, mas eles fazem coisas diferentes. Passando pela referência:... Posso sempre passar pelo valor.
- evita uma cópia, o que provavelmente é inútil para os inteiros, mas é útil para objectos grandes ou caros para copiar
- permite que o chamador veja o que a chamada função fez com o seu argumento. Não é provável que seja. útil para
std::sort
, mas em geral permitir parâmetros de entrada pode ser útil
It may allow std::sort
to act on iterator references, avoiding a copy (although iterators are types barately-to-copy value types anyway), but I haven't tried it. Se achas que te vai ajudar nalguma coisa, porque não experimentas e vês?