Как создать и использовать не тип шаблона в C ++ и где он будет использоваться - PullRequest
0 голосов
/ 05 января 2012

Я пытаюсь выучить шаблоны на С ++.Может кто-нибудь объяснить, почему sq () работает, а add () - нет?Как можно исправить () добавить?Что такое использование не типовых шаблонов?

template <typename T>
inline T sq (const T& x) 
{
    return x*x;
}

template <int*>
inline int add(int* x)
{
   return (*x)*2;
}



int main() {
int x = 2;
cout<<"Square(2): "<<sq(2)<<" Add(2): "<<add(&x)<<endl;
return 0;
}

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

template <typename T>
inline T sq (const T& x) 
{
    return x*x;
}

template <int>
inline int add(int x)
{
   return x+x;
}



int main() {
    cout<<"Square(2): "<<sq(2)<<" Add(2): "<<add(2)<<endl;
    return 0;
}

Ответы [ 5 ]

4 голосов
/ 05 января 2012

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

template <int N>
inline int add(int x)
{
    return x + N;
}

int main()
{
    std::cout << add<3>(2) << std::endl; // prints 5
    std::cout << add<4>(2) << std::endl; // prints 6
}

Чтобы ответить на ваш конкретный вопрос о том, почему sq(2) компилируется, а add(&x) нет: параметры типа шаблонов функций могут быть выведены из аргументов функции. Так что sq(2) эквивалентно sq<int>(2). Нетипичные параметры не могут быть выведены, поэтому вы должны предоставить один. В случае параметра указателя аргумент должен быть указателем на переменную с внешней связью, поэтому следует скомпилировать следующее:

int global;

int main() {
    int local = 2;
    std::cout << add<&global>(&local) << std::endl;
}
4 голосов
/ 05 января 2012

Классический пример использования нетипичного параметра шаблона для шаблона функции будет выглядеть примерно так:

template <typename T, size_t N>
T*
end( T (&array)[N] )
{
    return array + N;
}

В этом случае, если вы напишите что-то вроде:

int a[] = { 1, 2, 3, 4 };
int* endPtr = end(a);

компилятор может определить длину массива для вас.

2 голосов
/ 05 января 2012

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

РЕДАКТИРОВАТЬ: Если из вашего названия я сделаю вывод, что вы хотите знать о нетипа шаблона, как насчет полностью неполного примера массива:

template <typename T, int length>
struct Array
{
    T array_data_[length];
};
0 голосов
/ 05 января 2012

Смысл шаблонов в том, что вам не нужно определять конкретный тип данных в функции или классе. Посмотрите на T add (const T& x). Здесь нет типа данных, просто большой T. Это связано с тем, что шаблоны могут принимать идентичность любого типа данных, int, double, char или чего бы то ни было.

#include <iostream>
using namespace std;

template <typename T>
inline T sq (const T& x) 
{
    return x*x;
}

template <typename T>
inline T add (const T& x)
{
   return x+x;
}

template <typename T>
inline T divide (const T& x, const T& y)
{
   return x/y;
}


int main() 
{
    int x = 3;
    cout<<"int \n";
    cout<<"Square(3)    : "<<sq(x)<<" \n";
    cout<<"Add(3)       : "<<add(x)<<" \n";

    double y=3.00;
    cout<<"\ndouble \n";
    cout<<"Square(3)    : "<<sq(y)<<" \n";
    cout<<"Add(3)       : "<<add(y)<<" \n";

    double v=3.00;
    double w=2.00;
    cout<<"\ndouble \n";
    cout<<"Square(3)    : "<<sq(v)<<" \n";
    cout<<"Add(3)       : "<<add(v)<<" \n";
    cout<<"divide(3/2)  : "<<divide(v,w)<<" \n";
    cout<<"\n \n";

return 0;
}
0 голосов
/ 05 января 2012

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

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