C++ 模板和子类?

标签 c++ oop interface

所以,我正在学习 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/

相关文章:

c++ - 用 vector 的 vector 描述一个很长的矩阵,哪个维度应该是最大的?

在临时对象上调用方法的 PHP 语法

java - 一个空的抽象类有什么用?

c# - ObservableCollection 作为参数和接口(interface)传递

c++ "GetThreadTimes"但分辨率更高

c++ - 中断 native 函数内 v8 脚本的执行

php - 使用抽象参数实例化对象

asp.net-mvc - 为什么一个 MVC 应用程序中有这么多接口(interface)

c++ - std::list 接口(interface)内存泄漏

c++ - 需要从 C++ 代码编写 C 代码吗?