/** An exception class for run-time type errors */
template <typename T>
class IsNot : public std::domain_error {
IsNot() : domain_error(string("Is not ") + typeid(T).name()) {}
IsNot() : domain_error(std::string("Is not ") + typeid(T).name()) {}
};
/** A type with only one value, which (in principle) is only equal to itself.