gpt4 book ai didi

C++ 模板和子类?

转载 作者:太空狗 更新时间:2023-10-29 23:47:52 24 4
gpt4 key购买 nike

所以,我正在学习 C++,我遇到了一些我知道如何用 Java 做,但不是用 C++ 做的事情:)。

我有一个容器对象的模板,它是这样定义的:

template <class T>
class Container {
vector<T> contained;

public:

void add(T givenObject) {
this->contained.push_back(givenObject);
}

T get(string givenIdentifier) throw (exception) {
for (int i = 0; i < this->contained.size(); i++) {
if (this->contained[i].getIdentifier() == givenIdentifier) {
return this->contained[i];
}
}
throw new exception("An error has occured which has caused the object you requested to not be found. Please report this bug.");
}

bool empty() {
return this->contained.empty();
}

bool identifierExists(string givenIdentifier) {
for (int i = 0; i < this->contained.size(); i++) {
if (this->contained[i].getIdentifier() == givenIdentifier) {
return true;
}
}
return false;
}
};

这实际上工作得很好,有一个小问题。它归结为两行:第一行是模板定义,第二行是

this->contained[i].getIdentifer()

在 Java 中,当声明一个通用(模板)时,可以定义一个父类(super class)/接口(interface),T 的所有成员都必须扩展它,以免产生错误。但是,我不确定在 C++ 中执行此操作的方法,我担心的是将此处的实现耦合到可能未定义的 getIdentifier 方法是糟糕的设计。

现在,如果是这样的话,这没什么大不了的,这只是一个帮助我学习语言的小挑战项目,但我喜欢尝试把事情做好。有没有办法做我想做的事?我知道您可以使用基元来做到这一点,例如:

template <int T>

是有效的,但是当我尝试使用用户定义的类时,出现编译器错误。有什么建议吗?

最佳答案

您不可能对模板类型参数施加人为限制。如果给定的类型不支持您使用它的方式,您将收到编译器错误。一个名为“概念”的功能,基本上允许这样做,将被添加到下一个 C++ 标准,但由于时间限制,它被推迟到下一个下一个标准。如果 T 没有可见的 getIdentifier()函数,实例化不会编译。

模板参数需要在编译时推导。 template<int T>是有效的,因为第一个模板参数是一个整数;您可以使用任何常量整数实例化它。如果您尝试将它与非常量整数变量一起使用,它将无法编译。类的实例不是编译时常量,因此不能使用。

关于C++ 模板和子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3452565/

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