Использование макроса в зависимости от целого числа - PullRequest
1 голос
/ 01 июня 2009

Мне нужно использовать макрос несколько раз внутри функции, и макрос, который нужно использовать, зависит от числа, которое я передаю в функцию.

например.

  function(int number) { 
    switch(number) { 
       case 0: doStuff(MACRO0); break; 
       case 1: doStuff(MACRO1); break; 
    } 
  }

Проблема в том, что у меня есть много вещей, которые нужно сделать для каждого оператора switch с тем же макросом. Есть ли более элегантное решение, чем все это в выражении switch? Как передать сам макрос в функцию? Я читал о методах, подобных eval () в C ++, но они просто не подходят мне. Другой способ - определить, что расширяет макрос, но я не нашел никакой информации по этому вопросу.

О, на самом деле это openGL.

Ответы [ 3 ]

8 голосов
/ 01 июня 2009

Я бы использовал функциональный объект

struct Method1 {
    void operator()() { ... }
};

template<typename Method>
void function(Method m) {
    ...
    m();
    ...
}

int main() {
    function(Method1());
}
4 голосов
/ 01 июня 2009

Это очень сильно зависит от того, на что распространяется MACRO1. Если это константа, вы можете просто вызвать функцию вне switch или выполнить несколько аварийных случаев. Если это зависит от локального контекста, вам придется каждый раз оценивать его.

2 голосов
/ 01 июня 2009

В дополнение к вышеупомянутым предложениям, я часто нахожу, что использование виртуального наследования может избавить от длинных условий, особенно кода типа switch-over-enums. Я не уверен, какова ваша конкретная ситуация, поэтому я не уверен, насколько он будет применим, но допустим, что выше было

enum StyleID { STYLE0 = 0, STYLE1, STYLE2 /* ... */ };

void drawStyle(StyleID id) {
  switch(id) {
     case STYLE1: doDraw(MACROSTYLE1); break;
     /* ... */
  };
}

Длинных блоков коммутаторов можно избежать с помощью виртуального наследования:

class StyleInterface {
   /* some methods */
   virtual void doDraw() = 0;
};

class Style1 : public StyleInterface {
   /* concrete impl */
   virtual void doDraw() { doDraw(MACROSTYLE1); }
};

void drawStyle(StyleInterface* id) {
    id->doDraw();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...