В качестве (несколько уродливого и хрупкого) обходного пути вам может потребоваться специализация структуры, а не функции, и включить константу класса, чтобы указать, была ли структура специализированной:
template <typename T>
struct ToBool {
static bool tobool(const T&);
static const bool specialized = false;
};
Другой вариант -определить tobool
только в специализациях.Таким образом, ToBool<Foo>::tobool(f)
не будет компилироваться для любых классов Foo
, для которых ToBool
не специализировался.
В качестве альтернативы tobool
, вы можете использовать явные операторы преобразования, если у вас естьконтроль над классами, которые будут преобразованы.
class Foo {
public:
operator bool();
...
};
...
Foo f;
if (f) ...
Если тип не имеет преобразования bool (ну, преобразование в числовой или указательный тип, оба из которых имеют стандартные преобразования в bool),Программа не скомпилируется.Вуаля, проверка времени компиляции для преобразования.
Если вы не хотите неявного преобразования в bool, вы можете определить оператор!и используйте двойной удар для явного преобразования (хотя это не так читабельно):
class Foo {
public:
bool operator!();
...
};
...
Foo f;
if (!!f) ...