如何专门化字符串数组的模板?

How to specialize template for array of strings?

本文关键字:数组 专门化 字符串      更新时间:2023-10-16

我尝试制作一个示例将字符串数组传递给专门的模板构造函数,但实际上我没有收到任何错误,但此示例不起作用。 我试过这样: 调用模板类构造函数:

int ia[] = { 6, 7, 8, 3 };
const sav<int> si( ia, sizeof( ia ) / sizeof( ia[ 0 ] ) );
std::string sa[] = { "World" , "Hello" };
const sav<std::string> ss( sa, sizeof( sa ) / sizeof( sa[ 0 ] ) );

在我的模板中,我有:

template<typename T>
class sav{
public:
sav(T* givenArray,size_t size) {
std::cout<<"not specialized" << std::endl;
}
};
/* ** */
template<>
class sav<std::string[]>{
public:
sav(std::string* givenArray[],size_t size) {     
std::cout<<"specialized" << std::endl;
}
};

我想ss情况下使用第二个,但这仍然适用于第一个。

那是因为当特化sav<std::string[]>时,您使用sav<std::string>

专业化应该是sav<std::string>的。

的和你的专业sav构造函数也是错误的,因为第一个参数是指向std::string的指针的"数组"。

如果理解您的意图,请正确声明专用构造函数:

template<>
class sav<std::string[]> {
public:
sav(std::string givenArray[], size_t size) {
std::cout << "specialized" << std::endl;
}
};

并像这样使用:

const sav<std::string[]> ss(sa, sizeof(sa) / sizeof(sa[0]));

更新:

您还可以像这样声明构造函数:

template<>
class sav<std::string> {
public:
sav(std::string* givenArray , size_t size) {
std::cout << "specialized" << std::endl;
}
};

如果要避免数组声明,请按以下方式调用它:

const sav<std::string> ss(sa, sizeof(sa) / sizeof(sa[0]));

您将模板参数指定为std::string,而不是数组。我想你应该把模板专门化为

template<>
class sav<std::string>{
public:
sav(std::string* givenArray,size_t size) {     
std::cout<<"specialized" << std::endl;
}
};