我遇到了这个问题不少次。比方说,我有一个方法:重载一个方法只是为了在C++中报告更好的错误。有没有更好的办法?
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);
}
这工作得很好,我得到一个不错的,明确的错误消息。该函数刚好位于“正确”函数的定义之前,它立即清楚我(或正在使用我的代码的人)做错了什么,以及如何纠正它(即调用正确的过载)。
但这明显污染了方法列表。有没有其他方法可以输出更好的错误信息?
这不会让这个功能有点不那么清晰(尤其是当您依赖智能感应?)。那么现在用户可能会认为该函数可以接受非指针类型,并且可能会感到困惑?即使他们(我)不会感到困惑,他们会犯传递非指针类型的错误(或传递一个取消引用的指针!),因为函数似乎不接受指针。 – Samaursa 2012-02-18 22:02:26
你可以命名模板参数'TPtr'来使它更清晰。没有银弹。 – Thomas 2012-02-18 22:05:05
嗯,我真的喜欢这个建议......加上一些类型的操作,我实际上可以把静态断言放在函数的顶部......我喜欢那个(+1)。如果您添加额外信息,我会将其标记为正确。 – Samaursa 2012-02-18 22:07:16