Search code examples
c++c-preprocessorpreprocessor-directive

#if inside #define?


I'm sitting on some legacy code that generates a lot of code through #defines. Now I know it's not possible to have an #ifdef inside a #define, but is an #if possible? I would like to do add some specialization for a specific type. (without making major changes like using templates instead). The following sample gives me cryptic errors so this is not the way:

#define MK_GET(type) \
  type get_ ## type (int index) \
  { \
    #if type == double \  <-- what i want to add
      specialized code... \
    #endif
    ...
  } \

MK_GET(double);
MK_GET(int);
MK_GET(string);

Solution

  • You could achieve that with templates:

    template<typename T>
    struct getter
    {
        T operator()(int index)
        {
            // general code
        }
    };
    
    template<>
    struct getter<double>
    {
        T operator()(int index)
        {
            // specialized code
        }
    };
    
    #define CAT(a, b) a ## b
    #define MK_GET(type) type CAT(get_, type) (int index) getter<type>()(index)