# если внутри # определить? - PullRequest
       6

# если внутри # определить?

6 голосов
/ 08 декабря 2011

Я сижу на каком-то устаревшем коде, который генерирует много кода через #defines. Теперь я знаю, что невозможно иметь #ifdef внутри #define, но возможно ли #if? Я хотел бы добавить специализацию для определенного типа. (без внесения серьезных изменений, таких как использование шаблонов). Следующий пример дает мне загадочные ошибки, так что это не так:

#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);

Ответы [ 4 ]

7 голосов
/ 08 декабря 2011

Этого можно добиться с помощью шаблонов:

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)
0 голосов
/ 08 декабря 2011

Препроцессор является однопроходным процессом, поэтому вы не можете помещать определения макросов внутри определений макросов. Единственный способ сделать это - через интерфейс шаблона.

0 голосов
/ 08 декабря 2011

#if не может быть вложено внутрь #define. Почему вы хотите избежать template с, когда это лучший выбор. Они безопасны и «компилируемы» (без предварительной обработки).

0 голосов
/ 08 декабря 2011

Почему ты не пишешь это так:

#if (type == double)
    #define MK_GET  some code
#else
    #define MK_GET  same code with changes
#endif
...