C ++:如何防止模板专门化指针?

时间:2012-02-16 13:45:31

标签: c++ templates pointers

如果我愚蠢得足以找不到答案,我会开始道歉。

我已经看过几十页讨论为指针参数设置特定的模板专门化。

我希望能够阻止模板专门指针参数,但我无法弄清楚如何做到这一点。

template< class T >
void function( T arg )
{
  //...
}

int main( )
{
    int i = 42;

    function( i );    // Ok
    function( &i );   // Die bastart with a compiler error!
}

有可能吗?

感谢。

3 个答案:

答案 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的类型特征设施。