Problema macro C ++ (interpretación de coma,)

El siguiente código se compila bien.

#define CMD_MACRO(pp, cmd)  \
{           \
      if (pp)\
      { cmd; }        \
}

template<class T> void operate_on(T &data, char c) {
  data=data+1;
};

int main() {
  int book=4;
  char c;
    CMD_MACRO(book, {
        operate_on<int>(book, c);
    });
};

enga en cuenta que la macro real en mi código es más compleja. He dado una versión simplificada que puede no tener mucho sentido lógic

Ahora, si agrego otro parámetro de plantilla en la función, se produce un error de compilación (el problema se explica en el comentario del código):

template<class T, bool b> void operate_on(T &data, char c) {
  data=data+1;
};
int main() {
      int book=4;
      char c;
        CMD_MACRO(book, {
            operate_on<int, false>(book, c); /* here the "," between int and 
                  false is being treated 
                  as separating arguments to CMD_MACRO, 
                  instead being part of 'cmd'. Thats strange 
                  because the comma separating book and c is 
                  treated fine as part of 'cmd'. */
        });
};


test.cpp:18:6: error: macro "CMD_MACRO" passed 3 arguments, but takes just 2
test.cpp: In function 'int main()':
test.cpp:16: error: 'CMD_MACRO' was not declared in this scope

Cómo solucionar el problema (necesito agregar ese parámetro de plantilla adicional al código existente y obtengo ese error).

Respuestas a la pregunta(1)

Su respuesta a la pregunta