如何在c ++中创建和使用非类型模板以及在何处使用它

时间:2012-01-05 15:55:36

标签: c++ templates

我正在尝试用c ++学习模板。有人可以解释为什么sq()工作,add()不工作?如何修复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 个答案:

答案 0 :(得分:4)

我不太确定你在问什么,但你可以使用非类型模板参数,例如,定义一个函数模板,在其参数中添加任何编译时常量:

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;
}

答案 1 :(得分:4)

使用非类型模板参数的经典示例 功能模板类似于:

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 :(得分:2)

您的add功能不使用任何与模板相关的功能。它可以作为非模板函数正常工作。我无法弄清楚你真正想做的事情,不幸的是我甚至无法猜测你真正的问题。

编辑:如果从你的标题我推断你想知道非类型模板参数,那么一个完全不完整的数组示例:

template <typename T, int length>
struct Array
{
    T array_data_[length];
};

答案 3 :(得分:-1)

正如所说的,你要做的是一些毫无意义的事情,唯一一种你可能想在模板中提供确切参数类型的情况是模板函数重载。例如,当你想让一些函数以某种特殊类型的不同方式工作时,这称为模板特化。有关详细信息,您可能想要访问 : Function template specialization format

答案 4 :(得分:-1)

模板的重点在于您无需在函数或类中定义特定的数据类型。 看T add (const T& x)。这里没有数据类型,只有一个大的T。这是因为模板可以假定任何数据类型intdoublechar的身份,或者你投掷的任何数据类型。

#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;
}