samedi 27 novembre 2010

C++0x - shared_ptr, bind, et for_each

Pour ceux qui utilisaient déjà Boost, rien de fondamentalement nouveau sous le soleil: C++0x fournit enfin en standard une implémentation de pointeur partagé, ainsi que la fonction de bind qui va bien. Le vieux code Boost peut être mis à jour simplement en remplaçant vos boost:: par des std::, hormis cependant une petite subtilité: les paramètres tels _1, _2, ne sont pas dans le namespace global comme avec boost, mais dans le namespace std::placeholders. L'on pourra soit faire un using namespace std::placeholders;, soit, pour éviter les conflits si l'on inclut également Boost, créer un alias afin de réduire la verbosité du code.


#include <iostream>
#include <algorithm>
#include <memory>
#include <vector>
#include <string>

namespace p = std::placeholders;

class Miaou
{
public:
Miaou(const std::string & v):
m_v(v)
{
}

void print()
{
std::cout << m_v << std::endl;
}

private:
std::string m_v;
};

int main()
{
std::vector<std::shared_ptr<Miaou> > v =
{std::shared_ptr<Miaou>(new Miaou("a")),
std::shared_ptr<Miaou>(new Miaou("b")),
std::shared_ptr<Miaou>(new Miaou("c"))};

std::for_each(v.begin(),
v.end(),
std::bind(&Miaou::print, p::_1));

return 0;
}


Avec ces constructions additionnelles de ce côté, et les lambdas de l'autre, ce sont tous les algorithmes qui deviennent bien plus utiles. Je rêve de pouvoir enfin donner à std::accumulate la place qui lui revient!

Aucun commentaire: