C++模板和子类?

Eri*_*sma 2 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

这实际上非常有效,只有一个小问题.它归结为两行:第一行是模板定义,第二行是

this->contained[i].getIdentifer()
Run Code Online (Sandbox Code Playgroud)

在Java中,当声明Generic(模板)时,可以定义一个超类/接口,T的所有成员必须扩展它才能不创建错误.但是,我不确定在C++中这样做的方法,我担心的是将这里的实现耦合到一个可能没有定义的getIdentifier方法是糟糕的设计.

现在,如果是这样的话,这不是一个大问题,这只是一个帮助我学习语言的挑战项目,但我喜欢尝试做正确的事情.有办法做我想的吗?我知道你可以用原语来做,例如:

template <int T>
Run Code Online (Sandbox Code Playgroud)

是有效的,但是当我尝试使用用户定义的类时,我收到编译器错误.有什么建议?

Col*_*nee 5

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

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