Проблема в том, что - если вы не пишете свой код в качестве шаблона или не используете функции C ++ 0x - вы должны назвать тип выражения boost :: bind. Но эти типы обычно имеют очень сложные имена.
Вывод аргумента шаблона в C ++ 98:
template<class Fun>
void main_main(Fun fun) {
set<pair<int,long>,Fun> s (fun);
…
}
int main() {
main_main(…boost::bind(…)…);
}
С auto и decltype в C ++ 0x:
int main() {
auto fun = …boost::bind(…)…;
set<pair<int,long>,decltype(fun)> s (fun);
main_main(boost::bind(…));
}
Что касается фактического выражения bind, я думаю, что-то вроде этого:
typedef std::pair<int,long> pil;
boost::bind(&pil::second,_1) < boost::bind(&pil::second,_2)
(непроверенные)