J'essaie d'implémenter une version de foncteur de static_cast
à utiliser dans std::bind()
.Functor version de static_cast dans std :: bind()
Je suis au courant de Boost ll_static_cast<K>()
(voir using static_cast with boost::bind), mais je n'utilise pas Boost pour le moment.
Il est un exemple de code dans Why do several of the standard operators not have standard functors? mais il ne compilera pas sur GCC 4.2.1:
template <typename Target>
struct StaticCast
{
template <typename Source>
Target operator()(Source&& source) const
{
return static_cast<Target>(source);
}
}
J'ai réussi à obtenir quelque chose à compiler, mais je ne suis pas sûr qu'il est correct:
template <class Target>
struct StaticCast : public std::unary_function<void, Target> {
template <class Source>
Target operator()(Source& src) const {
return static_cast<Target>(src);
}
};
Quelqu'un peut-il me dire si cette version est correcte, et si c'est le cas, pourquoi ai-je besoin de std::unary_function
qui n'est pas utilisé dans l'exemple de code précédent?
Utilisation:
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"));
Si vous utilisez 11 C++, mais pas utiliser lambdas? 'std :: for_each (vec.begin(), vec.end(), [] (objet BaseObject *) {static_cast> (obj) -> doStuff();}' –
kennytm
Malheureusement, je suis coincé avec GCC 4.2.1 pour le moment, qui ne les supporte pas (j'ai enlevé 'tr1 ::' dans le code pour plus de simplicité) – OlivierB