0

我有一个向量,它是std::unique_ptr我的基本 struct的一个向量TextElBaseParams。该向量的元素由模板化的结构组成TextElParams<T>,这些结构派生自TextElBaseParams. 派生结构包含一个指向名为 T 的变量的指针var

我有一个只能接受的功能TextElParams<T>。由于显而易见的原因,我无法将元素从向量的传递TextElBaseParams给这个函数,所以我认为我可以在将这些元素传递给函数之前以某种方式将它们转换回它们的“派生”类型。

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

我正在使用 SFML,但与此相关的唯一事情是无关紧要的。这是我的代码的基本大纲:

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如果您直接为其提供TextElParams<T>结构,则可以使用。

4

1 回答 1

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
于 2018-06-13T14:54:34.047 回答