我一直在研究使用一些明智的静态断言来改进错误消息。这是一个例子:
#include <type_traits>
template<typename T> struct is_less_than_comparable {
template<typename Test> static char test(decltype(*static_cast<Test*>(nullptr) < *static_cast<Test*>(nullptr)));
template<typename Test> static int test(...);
static const bool value = std::is_same<char, decltype(test<T>(true))>::value;
};
template<typename K, typename V> class map {
public:
static_assert(is_less_than_comparable<K>::value, "Key type must be less-than comparable!");
};
struct x {};
int main() {
map<x, int> intmap;
}
IDEONE 会很高兴地拒绝这段代码,并给出我希望得到的漂亮、干净的错误消息(无论如何,一旦你将 nullptr 替换为 0)。但是 MSVC 不会触发静态断言并很好地编译这段代码——即使我添加了一些成员函数并开始调用它们。