Note there is a simple async client example at
https://github.com/grpc/grpc-common/blob/master/cpp/helloworld/greeter_async_client.cc
1. What exactly do you want to achieve by the fire and forget rpc? It can be done by making a rpc and cancel it later, but this depends on the server does not check cancel status and stops processing rpc.
2. The above example shows exactly this, you can do other things before you call Next which serves as the rpc.WaitFor() you want.
3. I think you will need some thread polling the client side completion queue (which can be shared by different rpcs) and run the callback upon a finished rpc.
In the example code, you can also find that you just need to create a CompletionQueue locally and attach it to a rpc call and all the events will come back on the queue. The end2end test is no longer a good example of using the API.
Thanks.