C ++: Как запретить шаблону специализировать указатель? - PullRequest
7 голосов
/ 16 февраля 2012

Я начинаю извиняться, если я настолько глуп, что не могу найти ответ, если это так очевидно.

Я видел десятки страниц, на которых говорилось о конкретной специализации шаблона для указателя параметров.

Я хотел бы, однако, иметь возможность запретить шаблону специализировать параметры указателя, но я не могу понять, как это сделать.

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

int main( )
{
    int i = 42;

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

Возможно ли это?

Спасибо.

Ответы [ 3 ]

14 голосов
/ 16 февраля 2012

Вы можете объявить специализацию (в данном случае это технически просто перегрузка), но не определить ее:)

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
}
7 голосов
/ 16 февраля 2012

В 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.
}

Пример можно найти здесь, на Ideone .

Я рекомендую это, потому что это даст более полезные сообщения об ошибках, когда кто-то попытается вызвать вашу функцию с указателем (ошибки компоновщика могут быть очень запутанными в этом случае). Кроме того, ошибки компоновщика не будут отображаться до того, как произойдет связывание.

6 голосов
/ 16 февраля 2012

Я сам шаблонный новичок метапрограммирования, но я думаю

template<typename T>
void function(typename std::enable_if<!std::is_pointer<T>::value,T>::type arg)
{
    //...
}

должно работать, так как эта функция должна существовать только для параметров без указателя. Конечно, для этого требуется C ++ 11 или, по крайней мере, TR1 или возможности типа Boost.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...