我多次遇到这个问题。假设我有一个方法:
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
实现,如果没有,则会给出明显的错误。也许其他人会对此提出解决方案。