我有一个向量,它是我的基础结构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
结构提供。
答案 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