获取基类向量的派生结构元素的模板化类型

时间:2018-06-12 16:22:44

标签: c++ templates polymorphism

我有一个向量,它是我的基础结构std::unique_ptr的{​​{1}}。此向量的元素由模板TextElBaseParams的结构组成,这些结构源自TextElParams<T>。派生的struct包含一个指向名为TextElBaseParams的类型为T的变量的指针。

我有一个只能接受var的功能。由于显而易见的原因,我无法将TextElParams<T>的向量中的元素传递给此函数,因此我认为我可以某种方式将这些元素转换回它们的&#34;派生的&#34;在将它们传递给函数之前键入。

这是正确的方法吗?如果是这样,实现这个最简单的方法是什么?如果没有,我可以使用哪些替代方案来解决这个问题?

我正在使用SFML,但这里唯一与之相关的事情是无关紧要的。以下是我的代码的基本概要:

TextElBaseParams

我尝试调用一个带有struct TextElBaseParams { }; template <typename T> struct TextElParams : public TextElBaseParams { TextElParams( std::string _font = "", std::string _str = "", int _fontSize = 1, sf::Vector2f _position = {0,0}, T *_var = nullptr ) : font{_font}, str{_str}, fontSize{_fontSize}, position{_position}, var{_var} {} std::string font; std::string str; int fontSize; sf::Vector2f position; T *var; }; 参数的函数addElement

TextElParams<T>

std::vector<std::unique_ptr<TextElBaseParams>> tParamsVec; //Filled with derived elements for(unsigned int i=0; i<tParamsVec.size(); ++i) addElement(*tParamsVec.at(i)); 函数的原型:

addElement

template<class T> void addElement(TextElParams<T> &tParams); 如果您直接向addElement结构提供。

1 个答案:

答案 0 :(得分:0)

虚拟功能的用途。在基类中创建一个虚函数,并在派生类中重写它。现在,如果通过指向基类的指针调用函数,则会调用相应的派生函数。参见示例:

class Base {
public:
    virtual void invoke() = 0;
    virtual ~Base() {}
};

template<typename T>
class Derived;

template<typename T>
void func(Derived<T>& arg) {
    std::cerr << "called func with type " << typeid(T).name() << std::endl;
    // do smth with arg
}

template<typename T>
class Derived : public Base {
public:
    void invoke() override {
        func(*this);
    }
};

int main() {
    std::vector<std::unique_ptr<Base>> vec;

    vec.push_back(std::make_unique<Derived<int>>());
    vec.push_back(std::make_unique<Derived<double>>());
    vec.push_back(std::make_unique<Derived<void>>());

    for (const auto& t: vec) {
        t->invoke();
    }
}

输出:

called func with type i
called func with type d
called func with type v