重载一个方法只是为了在C++中报告一个更好的错误.有更好的方法吗

Overloading a method just to report a nicer error in C++. Is there a better way?

本文关键字:一个 更好 方法 报告 错误 重载 C++      更新时间:2023-10-16

我多次遇到这个问题。假设我有一个方法:

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实现,如果没有,则会给出明显的错误。也许其他人会对此提出解决方案。