重载一个方法只是为了在C++中报告一个更好的错误.有更好的方法吗
Overloading a method just to report a nicer error in C++. Is there a better way?
我多次遇到这个问题。假设我有一个方法:
template <typename T>
bool Foo(T* param)
{
//...
}
如果我传递一个非指针,Visual Studio会给我一个错误:could not deduce template argument for '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->
或operator*
对于类型T
是未定义的,希望它也能告诉你T
的具体类型是什么
我不确定这是否真的有助于澄清您的错误信息。但它附带了一个好处:您的函数也可以突然应用于其他类似指针的类型!
编辑:可能有一些SFINAE静态断言技巧来实际验证您想要的运算符是否为T
实现,如果没有,则会给出明显的错误。也许其他人会对此提出解决方案。
相关文章:
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 在类的第一个/最后一个实例存在之前/之后调用一对函数.有没有更好的方法?
- 做一个unordered_multimap键的平均值是更好的方法吗?
- 静态常量与常量局部变量,哪一个性能更好
- 试图为命名数组元素创建一个更好的循环
- 在 C 和 C++ 编程中使用哪一个更好?
- 哪一个更好?使用C 代码中的System()函数或使用源代码
- 如何将输入与文件中的内容相匹配?我需要一个更好的解释
- 一个更好的实数生成器
- 对于此语句,这是一个更好的表达
- 这是一个更好的Get成员方法
- 在 c++ 中选择有序映射的最后一个条目时,哪一个更好
- 为可变函数设计一个更好的API
- 重载一个方法只是为了在C++中报告一个更好的错误.有更好的方法吗
- typecasting与memcpy():哪一个更好
- c++的一个更好的低级别int交换
- 哪一个更好,自动&&,自动或自动常量
- 3D模型移动,找到一个更好的方式来移动3D模型
- 在QGraphicsView中设置QGraphicsScene的精确视图区域(rect) -一个更好的fitInView