如果我愚蠢得足以找不到答案,我会开始道歉。
我已经看过几十页讨论为指针参数设置特定的模板专门化。
我希望能够阻止模板专门指针参数,但我无法弄清楚如何做到这一点。
template< class T >
void function( T arg )
{
//...
}
int main( )
{
int i = 42;
function( i ); // Ok
function( &i ); // Die bastart with a compiler error!
}
有可能吗?
感谢。
答案 0 :(得分:14)
你可以声明专门化(在这种情况下,它在技术上只是一个重载),但没有定义它:)
template<typename T >
void function( T arg )
{
//...
}
template<typename T >
void function( T* arg ); //no definition
int main()
{
int i = 42;
function( i ); // Ok
function( &i ); //ERROR
}
答案 1 :(得分:7)
在C ++ 11中,您可以通过以下方式使用static_assert
:
template<class T>
void func(T arg) {
static_assert(!std::is_pointer<T>::value,
"The argument to func must not be a pointer.");
// Do something after the static_assert.
// Now you are sure that T isn't a pointer.
}
可以找到一个示例here on Ideone。
我推荐这个,因为当有人试图用指针调用你的函数时,它会提供更多有用的错误消息(链接器错误在这种情况下会非常混乱)。此外,链接错误在链接发生之前不会显示。
答案 2 :(得分:6)
我自己是一个模板元编程新秀,但我认为
template<typename T>
void function(typename std::enable_if<!std::is_pointer<T>::value,T>::type arg)
{
//...
}
应该可以工作,因为此函数应仅存在于非指针参数中。当然,这需要C ++ 11或至少TR1或boost的类型特征设施。