Я пытаюсь использовать статическое утверждение pre-C++ 11. Я нашел this и this вопрос, но почему-то я не могу получить его работы:Почему это статическое утверждение не работает?
#define STATIC_ASSERT(x) \
do { \
const static char dummy[(x)?1:-1] = {0};\
} while(0)
struct bar {
int value;
template<typename T> void setValue(T x);
};
template<typename T> void bar::setValue(T x) { STATIC_ASSERT(1==0); }
template<> void bar::setValue(int x) { value = x;}
int main(){
bar b;
int c = 1;
b.setValue(c);
}
результаты Компиляция (ССАГПЗ) в
error: size of array 'dummy' is negative
Я ожидал бы эту ошибку apprear только если я позвоню setValue
ни с чем кроме int
. Я также пробовал другие предлагаемые решения, но с более или менее одинаковым результатом: ошибка существует, даже если я не создаю экземпляр шаблона ни с чем иным, кроме int
. Что я делаю не так?
Просто интересно, вы знаете, вы не должны использовать шаблон вообще в таком случае, а просто записать его с 'int' типа? (Это все еще интересный вопрос и ответ по образовательным причинам, но я надеюсь, что ваше реальное использование не так тривиально :)). – Ped7g
@ Ped7g хорошо, на самом деле мое реальное использование так же тривиально, как пример. Я хочу абсолютно убедиться, что функция вызывается с параметром правильного типа, и преобразование не происходит. Является ли это хорошим подходом или нет, я еще не уверен, но это не обсуждение здесь. Я поставлю его на codereview ... – user463035818
найти ключевое слово explict – UKMonkey