2012-02-18 86 views
4

我遇到了这个问题不少次。比方说,我有一个方法:重载一个方法只是为了在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); 
} 

这工作得很好,我得到一个不错的,明确的错误消息。该函数刚好位于“正确”函数的定义之前,它立即清楚我(或正在使用我的代码的人)做错了什么,以及如何纠正它(即调用正确的过载)。

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

回答

1

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

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

在体内,只是假设param是一个指针。如果不是,编译器会抱怨operator->operator*未定义为T类型,并且希望它也会告诉你什么是T的具体类型。

我不确定这是否真的有助于您的错误消息的清晰度。但它带来了一项奖励:您的功能可以突然应用于其他指针类型!


编辑:可能有一些SFINAE静态断言弄虚作假实际验证所需的运营商正在为T实现并给出一个明确的错误,如果他们不是。也许别人会为此提供解决方案。

+0

这不会让这个功能有点不那么清晰(尤其是当您依赖智能感应?)。那么现在用户可能会认为该函数可以接受非指针类型,并且可能会感到困惑?即使他们(我)不会感到困惑,他们会犯传递非指针类型的错误(或传递一个取消引用的指针!),因为函数似乎不接受指针。 – Samaursa 2012-02-18 22:02:26

+2

你可以命名模板参数'TPtr'来使它更清晰。没有银弹。 – Thomas 2012-02-18 22:05:05

+0

嗯,我真的喜欢这个建议......加上一些类型的操作,我实际上可以把静态断言放在函数的顶部......我喜欢那个(+1)。如果您添加额外信息,我会将其标记为正确。 – Samaursa 2012-02-18 22:07:16

相关问题