Не лучшее решение, я полагаю, но ...
Если ваш компилятор активирует все предупреждения (-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;
^
также без вызова функции с объектом, не являющимся методом.