重载方法只是为了报告C中更好的错误.有没有更好的办法?
我遇到过这个问题很多次.假设我有一个方法:
template <typename T> bool Foo(T* param) { //... } 如果我传递一个非指针,Visual Studio会给我错误:无法推断’const T *’的模板参数,但由于代码是模板化的,因此附加了大量垃圾(我说垃圾是因为它是与错误无关…即命名空间和模板类型等).是的,我可以通过查看消息来判断出什么是错的,但是需要更长的时间,而且我认为人们可以将这长期浪费的时间联系起来. 所以我想我会提供一个重载并给出一个静态断言: template <typename T> bool Foo(T param) { STATIC_ASSERT_FORCE(Function_does_not_take_a_non_pointer_argument); } 这很好用,我收到一个很好的,明确的错误信息.这个函数放在“正确”函数的定义之前,它立即变得清晰,我(或使用我的代码的人)做错了什么以及如何纠正它(即调用正确的重载). 但这显然会污染方法列表.有没有其他方法可以输出更好的错误消息? 解决方法
您可以修改函数以接受任何类型,而不是只接受指针:
template <typename T> bool Foo(T param) { //... } 在正文中,假设param是一个指针.如果不是,编译器会抱怨operator->或者运算符*未定义类型T,并且希望它也会告诉你T的具体类型是什么. 我不确定这是否真的有助于清除错误消息.但它带来了一个好处:你的功能也可以突然应用于其他类似指针的类型! 编辑:可能有一些SFINAE静态断言技巧来实际验证您想要的运算符是否为T实现,如果不是则给出明确的错误.也许其他人会为此提出解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |