gpt4 book ai didi

c++ - 不同的功能取决于模板类中的类型

转载 作者:行者123 更新时间:2023-11-30 02:00:49 24 4
gpt4 key购买 nike

我原本打算为 Array 风格的类使用一个模板,然后将一个 char* 或一个 int 传递给它,但我在尝试时遇到了问题实现类似的事情:

template<Typename T>
class Array {
void add(T elem) {
if(size == capacity) expandArr();
if(T == char*) //g++ threw errors here
arr[size] = new char[strlen(word) + 1];
strcpy(arr[size], word);
else if(T == int) {
arr[size] = elem;
}

size++;
}
}

是否有另一种合法检查元素类型的方法?还是我应该将这两个类分开并让它们独立?

我最初尝试使用模板化类,因为两种数组类型具有相同的功能,但在这种情况下,char* 的内存分配方式存在一些根本差异>int 的。

最佳答案

在这种情况下,类模板特化有点过头了——它迫使您为不同的类型复制整个类,即使大约 90% 的功能是相同的。

关键是隔离那些不同的部分并只专门化这些部分。不过,出于多种原因,使用重载比使用特化更容易。

您的情况的不同之处仅在于将值分配给数组项。

template <typename T>
class Array {
void add(T elem) {
if(size == capacity) expandArr();
assignItem(elem);
size++;
}

template <typename U>
void assignItem(U elem) {
arr[size] = elem;
}

void assignItem(char* elem) {
// Incidentally, DON’T DO THIS! It leaks. Use RAII!
arr[size] = new char[strlen(elem) + 1];
strcpy(arr[size], word);
}
};

当然,现在您已经对 Array 支持的类型进行了硬编码:仅支持具有复制构造函数 char* 的类型, 没有其他类型。一般来说,您不需要此限制,您希望支持任意 类型并允许它们指定它们的复制方式1

有几种方法可以实现这一点。我将在这里通过指定如何复制类型的特征类来说明一个。

template <typename T>
struct CopyConstruct {
void assign(T& target, T source) const {
target = source;
}
};

template <typename T, typename Copy = CopyConstruct<T>>
class Array {
Copy copier;

void add(T elem) {
if(size == capacity) expandArr();
copier.assign(arr[size], elem);
size++;
}
};

这个类可以和你的初始类一样使用。对于 char*,用户有两种选择:要么专门化 CopyConstruct,要么在实例化 Array 时提供完全自己的特征,如下所示:

struct CopyCString {
void assign(char*& target, char* source) const {
target = new char[strlen(elem) + 1];
strcpy(arr[size], word);
}
};

// And then:

Array<char*, CopyCString> strArray;

(请注意,我们在这里将一个引用传递给一个指针——否则分配的内存将会丢失,因为我们会将指针分配给一个拷贝数组项,而不是项本​​身。)


1 但实际上 C++ 已经使用复制构造函数来达到这个目的。 真正的解决方案不是以上任何一种,而是将 char* 包装成可复制的类型,例如 std::string

关于c++ - 不同的功能取决于模板类中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14740815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com