Факториал может быть напечатан в сгенерированном компилятором сообщении как:
template<int x> struct _;
int main() {
_<Factorial<10>::value> __;
return 0;
}
Сообщение об ошибке:
prog.cpp: 14: 32: ошибка: агрегат ‘_ <3628800> __’ имеет неполный тип и не может быть определен
_ :: value> __;
^
Здесь 3628800
является факториалом 10
.
Посмотрите на ideone: http://ideone.com/094SJz
Так вы ищете это?
EDIT:
Матье попросил хитрый трюк для печати факториала и продолжения компиляции. Вот одна попытка. Это не дает никакой ошибки, следовательно, компиляция завершается одним предупреждением.
template<int factorial>
struct _{ operator char() { return factorial + 256; } }; //always overflow
int main() {
char(_<Factorial<5>::value>());
return 0;
}
Скомпилируется с этим предупреждением:
main.cpp: в экземпляре '_ :: operator char () [с int
factorial = 120] ': main.cpp: 16: 39: требуется отсюда
main.cpp: 13: 48: предупреждение: переполнение при неявном преобразовании констант
[-Woverflow] struct _ {operator char () {return factorial + 256; }};
// всегда переполняем
Здесь 120
является факториалом 5
.
Демонстрация на ideone: http://coliru.stacked -crooked.com / a / c4d703a670060545
Вы можете просто написать хороший макрос и использовать его вместо:
#define PRINT_AS_WARNING(constant) char(_<constant>())
int main()
{
PRINT_AS_WARNING(Factorial<5>::value);
return 0;
}
Это выглядит великолепно .