[gdal-dev] C++ template functions with raster bands

Ari Jolma ari.jolma at gmail.com
Tue Mar 29 22:26:47 PDT 2016


29.03.2016, 20:48, Even Rouault kirjoitti:
> Le mardi 29 mars 2016 17:35:26, Ari Jolma a écrit :
>> I want to write template functions like this:
>>
>> template<typename cell_type>
>> void map(GDALRasterBand *b, mapper<cell_type> *mapper) {
>> ...
>>
>> This function would map the cell values of a band to new ones using some
>> logic that is coded within the mapper object (and the logic depends on
>> the cell_type).
>>
>> I would like to catch errors which are due to mismatch between the band
>> data type and the template cell_type. So far I've discovered this:
>>
>>       band_wrapper band = band_initialize(b);
>>       if (band.info.size_of_data_type != sizeof(cell_type))
>>           goto fail_because_of_data_type_mismatch;
>>
>> but it is not bullet proof since data types can have an equal size but
>> be different. The band_initialize contains a switch statement, which
>> sets the info element of the band wrapper.
>>
>> Are there other ways to solve this problem? I could build long switch
>> statements but it is not very appealing. And it gets messy when there is
>> more than one band.
> Perhaps by using C++ traits like this :

Indeed. Thanks!

Ari

>
> #include <gdal.h>
>
> template <typename T> struct GetGDALDataTypeTraits
> {
>      static const GDALDataType datatype;
> };
>
> template<> struct GetGDALDataTypeTraits<unsigned char>
> {
>      static const GDALDataType datatype = GDT_Byte;
> };
>
> template<> struct GetGDALDataTypeTraits<unsigned short>
> {
>      static const GDALDataType datatype = GDT_UInt16;
> };
>
> template <typename T> static GDALDataType GetGDALDataType()
> {
>    return GetGDALDataTypeTraits<T>::datatype;
> }
>
> #include <iostream>
> int main(int argc, char* argv[])
> {
>    std::cout << "type unsigned char: " << GetGDALDataType<unsigned char>() << std::endl;
>    std::cout << "type unsigned short: " << GetGDALDataType<unsigned short>() << std::endl;
>    // Link time error
>    //std::cout << "type double: " << GetGDALDataType<double>() << std::endl;
>
>    return 0;
> }
>
>
>> Ari
>>
>> _______________________________________________
>> gdal-dev mailing list
>> gdal-dev at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/gdal-dev



More information about the gdal-dev mailing list