我一直在研究使用一些明智的静态断言来改进错误消息。这里有一个例子:不能在MSVC10中使用SFINAE,类型traits和static_assert
#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将愉快地拒绝这个代码与漂亮,干净的错误消息,我希望能得到(一旦你用0替换nullptr,反正)。但是MSVC不会触发静态断言并编译这些代码 - 即使我添加了一些成员函数并开始调用它们。
代码不编译我。是否需要一些额外的头文件? – 2011-06-09 22:58:33
@ Ben Voigt:'' –
Puppy
2011-06-09 23:07:44
我认为这与VC++没有执行模板相关参数的两阶段查找有关。 – 2011-06-09 23:28:24