Сообщение времени компиляции (после препроцессора) для использования с `if constexpr` - PullRequest
6 голосов
/ 10 июля 2020

Я использую if constexpr для проверки наличия метода в классе. Если метод отсутствует, я sh сообщаю пользователю, что функция была проигнорирована, и он должен реализовать ее, но это не обязательно.

Идея состоит в том, чтобы дать сообщение, подобное #warning, но препроцессор обрабатывается перед шаблоном, поэтому это никогда не сработает.

Есть ли время компиляции альтернатива обратной связи, которая пришла с C ++ 17? Или что-то запланированное для C ++ 20?

Запускаемый пример

template <typename State>
void callStateFunction(const State& state) {
  if constexpr (false) {
    state.method();
  } else {
    #warning The method State::method() was not implemented
  }
}

1 Ответ

1 голос
/ 10 июля 2020

Не лучшее решение, я полагаю, но ...

Если ваш компилятор активирует все предупреждения (-Wall для g ++ и clang ++, например), вы можете заменить строку #warning чем-нибудь которые генерируют предупреждение.

Например, неиспользуемая (возможно, с говорящим именем) переменная.

Я пробовал с

template <typename State>
void callStateFunction(const State& state) {
  if constexpr (false) {
    state.method();
  } else {
    int method_not_implemented[sizeof(State)];
  }
}

и звонил с не -метод (callStateFunction(1), например), я получаю

prog.cc: In instantiation of 'void callStateFunction(const State&) [with State = int]':
prog.cc:13:23:   required from here
prog.cc:7:9: warning: unused variable 'method_not_implemented' [-Wunused-variable]
    7 |     int method_not_implemented[sizeof(State)];
      |         ^~~~~~~~~~~~~~~~~~~~~~

из g ++ (голова 11.0.0) и

prog.cc:7:9: warning: unused variable 'method_not_implemented' [-Wunused-variable]
    int method_not_implemented[sizeof(State)];
        ^
prog.cc:13:4: note: in instantiation of function template specialization 'callStateFunction<int>' requested here
   callStateFunction(1);
   ^

из clang ++ (голова 11.0.0)

Я предлагаю, чтобы неиспользуемая переменная зависела от имени типа шаблона (State), в противном случае, если я определяю независимую переменную как

int method_not_implement;

, я получаю предупреждение от clang ++

prog.cc:7:9: warning: unused variable 'method_not_implemented' [-Wunused-variable]
    int method_not_implemented;
        ^

также без вызова функции с объектом, не являющимся методом.

...