Сначала идет определение нашего нового функционального объекта, contains_t. Он мог бы быть унаследован от вспомогательного класса std::unary_function (часть стандартной библиотеки C++, предназначенной для облегчения создания правильных определений типов) и иметь автоматически определяемые типы аргументов и результатов, но, чтобы все было ясно, требуемые определения типов предоставляется явно. Тип аргумента изменен с const boost::any& на boost::any, чтобы избежать потенциальной ссылки на ссылку, что является незаконным. Реализация такая же, как и раньше, только здесь она размещена в операторе вызова функции.
template <typename T> struct contains_t {
typedef boost::any argument_type;
typedef bool result_type;
bool operator()(boost::any a) const {
return typeid(T)==a.type();
}
};
Почему следующая реализация может получить ссылку на ссылку?
template <typename T> struct contains_t {
typedef boost::any argument_type;
typedef bool result_type;
bool operator()(const boost::any& a) const {
return typeid(T)==a.type();
}
};
Спасибо