我嘗試實現static_cast
的函子版本,以便在std::bind()
中使用。函數版本的std :: bind()中的static_cast()
我知道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,但不使用lambda表達式? 'std :: for_each(vec.begin(),vec.end(),[](BaseObject * obj){static_cast(obj) - > doStuff();}' –
kennytm
2012-01-10 16:15:19
不幸的是,我被GCC 4.2.1暫時不支持它們(爲簡單起見,我在代碼中刪除了'tr1 ::') – OlivierB 2012-01-10 16:17:44