オーバーロード関数へのポインタと汎用関数

id:Cryolite:20040820#p1において&fという式に型が存在しないことはすでに指摘しました.
このことは&fという式を汎用関数のパラメータとして直接に用いることが出来ないことを意味します.

template<class FP>
void g(FP fp)
{
  std::cout << fp(0) << std::endl;
}

g(&f); // コンパイルエラー!FPの型が決定できない!

上のように汎用関数のパラメータとしてオーバーロードされた関数へのポインタを代入したいという場面は,例えばSTLアルゴリズムのコールバック,あるいはboost::lambda::bind(boost::bind)のパラメータなど,比較的多く見受けられます.このような場合,いったんキャストを通して型の曖昧性を排除してからパラメータとするのが常套手段となっています.

g(static_cast<int (*)(int)>(&f));

このようなキャストが煩雑であるという背景から生まれたのが
http://lists.boost.org/MailArchives/boost/msg69451.php
の議論でした.