callback地獄という言葉もありますが
とりあえず
http://www.slideshare.net/chihayatakatuki/boost-asio
を見てみてください。きっとなにのことかわからないと思いますが、callback関数を多用した例です。
通信系ではパフォーマンス的に非同期通信することが多く、非同期ということは関数から制御が戻っても関数のお仕事が続いているということです。
その場合、お仕事が終わったら次にこのお仕事を
ということを実現するにはcallbackを使わざるを得ません。
ただcallbackを多用すると可読性が下がるので、future/thenだったりコルーチンだったりといろいろ工夫して同期処理とあまり変わらない見た目でコードを書こうという動きがC++に限らずJavaScriptなどでもあります。
とりあえずcallbackと戯れたい、ということだったらJavaScriptとJQueryでajax通信してみるといいと思います。
http://qiita.com/yumetodo/items/00b37234cb86e741f0fb
さて、ようやく本題。
callbackの使う場面は大きく2つ。
- 非同期処理
- アルゴリズム系関数に渡す(大小比較の条件(sort系関数)とか一致条件指定(std::all_of系関数)とか)
この2つではcallbackの役割が大きく異なります。前者は処理の流れそのものをcallbackが担うのに対し、後者はある概念で処理を共通化した時(ソートとか)共通化できなかった部分をcallbackに追い出す、というものになります。
この役割の違いは、callback関数の長さにダイレクトに影響してきます。
前者の場合callback関数自体が長くなることが多いのに対し、後者の場合、一行からせいぜい10行程度で収まることが多いです。