1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| #include <string>
#include <algorithm>
#include <vector>
using namespace std;
namespace vigra
{
enum ImageType
{
RGB8 = 0,
BW16 = 1
};
template <int IMAGETYPE>
class ImageTraits;
template <>
class ImageTraits<RGB8>
{
typedef unsigned char Type;
enum Infos
{
Depth = 3
};
};
template <>
class ImageTraits<BW16>
{
typedef unsigned short Type;
enum Infos
{
Depth = 1
};
};
template <int IMAGETYPE>
class BasicImage
{
size_t Size() const
{
return 64*32; // hauteur * largeur
}
};
}
template <int IMAGETYPE, template <int> class VIGRAIMAGE >
void EnregistrementImage( string const &, VIGRAIMAGE<IMAGETYPE> const & );
class Image
{
public:
virtual void Enregistrer() = 0;
};
template <class VIGRAIMAGE>
class ImageImpl : public Image
{
public:
virtual void Enregistrer()
{
EnregistrementImage( chemin_, img_ );
}
private:
string chemin_;
VIGRAIMAGE img_;
};
template <int IMAGETYPE, template <int> class VIGRAIMAGE >
void EnregistrementImage( string const & chemin, VIGRAIMAGE<IMAGETYPE> const & img )
{
// (...)
// file.write( img.Data(), img.Size()*sizeof( typename vigra::ImageTraits<T>::Type )*vigra::ImageTraits<T>::Depth );
}
struct Enregistrer
{
template <typename T>
void operator () ( T t )
{
t->Enregistrer();
}
};
int main()
{
vector<Image*> vec;
vec.push_back( new ImageImpl<vigra::BasicImage<vigra::RGB8> >() );
vec.push_back( new ImageImpl<vigra::BasicImage<vigra::BW16> >() );
for_each( vec.begin(), vec.end(), Enregistrer() );
// for_each( vec.begin(), vec.end(), Delete() );
} |