重载方法只是为了报告C ++中更好的错误。有没有更好的办法?

时间:2012-02-18 21:44:06

标签: c++ error-handling

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

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);
}

这很好用,我得到一个很好的,明确的错误信息。这个函数放在“正确”函数的定义之前,它立即变得清晰,我(或使用我的代码的人)做错了什么以及如何纠正它(即调用正确的重载)。

但这显然会污染方法列表。有没有其他方法可以输出更好的错误信息?

1 个答案:

答案 0 :(得分:1)

您可以修改函数以接受任何类型,而不是只接受指针:

template <typename T>
bool Foo(T param)
{
  //...
}

在正文中,假设param是一个指针。如果不是,编译器会抱怨operator->operator*未定义类型T,并希望它还会告诉您T的具体类型是

我不确定这是否真的有助于清除错误消息。但它带来了一个好处:你的功能也可以突然应用于其他类似指针的类型!


编辑:可能会有一些SFINAE静态断言技巧来实际验证您所需的运算符是否为T实现,如果不是,则会给出明确的错误。也许其他人会为此提出解决方案。