Я пытаюсь реализовать версию-функтор static_cast
для использования в std::bind()
.Функторная версия static_cast в std :: bind()
Я знаю Boost ll_static_cast<K>()
(см. using static_cast with boost::bind), но я не использую Boost прямо сейчас.
Существует пример кода в Why do several of the standard operators not have standard functors?, но он не будет компилироваться GCC 4.2.1:
template <typename Target>
struct StaticCast
{
template <typename Source>
Target operator()(Source&& source) const
{
return static_cast<Target>(source);
}
}
мне удалось получить что-то для компиляции, но я не уверен, что это правильно:
template <class Target>
struct StaticCast : public std::unary_function<void, Target> {
template <class Source>
Target operator()(Source& src) const {
return static_cast<Target>(src);
}
};
Может кто-нибудь сказать мне, если эта версия верна, и если это так, зачем мне std::unary_function
, который не используется в предыдущем примере кода?
Использование:
std::vector<BaseObject*> vec; // BaseObject* are known to be of type
// DerivedObject* of course, please don't ask me how or why...
std::for_each(vec.begin(), vec.end(),
std::bind(&DerivedObject::doStuff,
std::bind(StaticCast<DerivedObject*>(), std::placeholders::_1),
"with some string"));
Если вы используете C++ 11, но не использовать лямбды? 'std :: for_each (vec.begin(), vec.end(), [] (BaseObject * obj) {static_cast (obj) -> doStuff();}' –
kennytm
К сожалению, я застрял с GCC 4.2.1 на данный момент, который их не поддерживает (я просто удалил 'tr1 ::' в коде) – OlivierB