ポインタだけでなく参照も取る名前比較用のテンプレート化されたファンクタを定義したいと考えています。これを、要素のコンテナーの通常の find_if とポインターのコンテナーに使用したいと思います (残念ながら、ptr_vector などはオプションではありません)。
これまでに見つけた最良の解決策は次のとおりです。
template <typename U>
class by_name{
public:
by_name(U const& pName):mName(pName) {}
template <class T>
typename boost::disable_if_c<boost::is_pointer<T>::value, bool>::type
operator()(T const& pX){ return pX.getName()== mName;}
template <class T>
typename boost::enable_if_c<boost::is_pointer<T>::value, bool>::type
operator()(T pX){ return pX->getName()== mName;}
private:
U mName;
};
これは、enable_if を知らない人にとっては非常に見苦しく、理解するのが非常に難しいように見えます。ポインタと参照を同様に取るようなファンクタを書く簡単な方法はありますか?