Я пытаюсь реализовать функторную версию static_cast
для использования в std::bind()
.
Мне известно о Boost ll_static_cast<K>()
(см. с использованием static_cast с boost :: bind ), но сейчас я не использую Boost.
В * 1010 есть пример кода. Почему некоторые стандартные операторы не имеют стандартных функторов? , но он не будет компилироваться в 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"));