Here's a potential improvement to get around the isMonochrome_ dummy argument
oddness.  It's ugly but hopefully less surprising to end users of the API...

```C
#define OIIO_FIRST_ARG(...) OIIO_FIRST_ARG_HELPER(__VA_ARGS__, throwaway)
#define OIIO_FIRST_ARG_HELPER(first, ...) first

#define OIIO_DISPATCH_TYPES(name,func,type,...)                         \
    switch (type.basetype) {                                            \
    case TypeDesc::FLOAT :                                              \
        return func<float> (__VA_ARGS__); break;                        \
    case TypeDesc::UINT8 :                                              \
        return func<unsigned char> (__VA_ARGS__); break;                \
    case TypeDesc::HALF  :                                              \
        return func<half> (__VA_ARGS__); break;                         \
    case TypeDesc::UINT16:                                              \
        return func<unsigned short> (__VA_ARGS__); break;               \
    case TypeDesc::INT8  :                                              \
        return func<char> (__VA_ARGS__); break;                         \
    case TypeDesc::INT16 :                                              \
        return func<short> (__VA_ARGS__); break;                        \
    case TypeDesc::UINT  :                                              \
        return func<unsigned int> (__VA_ARGS__); break;                 \
    case TypeDesc::INT   :                                              \
        return func<int> (__VA_ARGS__); break;                          \
    case TypeDesc::UINT64:                                              \
        return func<unsigned long long> (__VA_ARGS__); break;           \
    case TypeDesc::INT64 :                                              \
        return func<long long> (__VA_ARGS__); break;                    \
    case TypeDesc::DOUBLE:                                              \
        return func<double> (__VA_ARGS__); break;                       \
    default:                                                            \
        (OIIO_FIRST_ARG(__VA_ARGS__)).error ("%s: Unsupported pixel data format '%s'", name, type); \
        return false;                                                   \
    }
```

See here for additional commentary (and some far more ugly general solutions
to the problem :-) ):
http://stackoverflow.com/questions/5588855/standard-alternative-to-gccs-va-args-trick