Все остальные ответы идут на метапрограммирование для обнаружения условия, с другой стороны, я бы упростил задачу:
template<Time t, int length>
class Timer
{
static_assert( (t == Day && length > 7)
||(t == Week && length > 10)
||(t == Month && length > 99), "Invalid parameters"
};
Компилятор вызовет утверждение, если условия не выполнены, иЭто довольно просто проверить с помощью сообщения об ошибке и / или глядя на строку.
Использование инструментов SFINAE для отключения версий типа также дает тот же результат: код не будет компилироваться, но за счетсделать сообщения об ошибках более сложными для чтения: что означает, что Timer<Day,5>
не тип?безусловно, это так, это экземпляр Timer<Time,int>
!
РЕДАКТИРОВАТЬ: Выше static_assert
реализован в C ++ 0x, в компиляторах без C ++ 0x вы можете реализовать static_assert
как макрос:
#define static_assert( cond, name ) typedef char sassert_##name[ (cond)? 1 : -1 ];
Этот простой макрос принимает строковый литерал в качестве второго аргумента, а не одно слово.Использование может быть:
static_assert( sizeof(int)==4, InvalidIntegerSize ) )
И сообщения об ошибках потребуют небольшого разбора, поскольку компилятор будет жаловаться (если условие не выполняется), что размер sassert_InvalidIntegerSize
отрицателен.