根据这些定义,并沿着这些线路一些代码,用于说明目的:如何在不知道底层类型的情况下从模板父类中获取值?
class Child
{
private:
std::string name;
public:
Child(const std::string & name) name(name)
{ }
}
template<typename T>
class Parent : public Child
{
private:
T data;
public Parent(const std::string & name, const T & data) : Child(name), data(data)
{ }
inline GetData() const
{
return this->data;
}
}
std::vector<std::unique_ptr<Child>> values;
values.emplace_back(std::make_unique<Parent<int>>("value a", 4));
values.emplace_back(std::make_unique<Parent<std::string>>("value b", "test"));
for (const auto & v : values)
{
// I want to access the int and string here!
}
如何将决定从这里基类的父类中使用的类型?
我一起工作的具体情况其实是,我有一堆包含有关存储过程的SQL参数,是应该被包含在std::vector<std::unique_ptr<SqlParameterBase>>
并传递到代表一个类SqlParameter<T>
模板信息SqlParameterBase
类一个存储过程配置,以便它可以被调用。
但是这里的根本问题是我需要访问底层数据,我想避免在基类中定义一个包含指向数据的指针的void *
。我更喜欢它是尽可能安全的。
我愿意接受其他设计或方法来解决这个问题,所以如果你觉得它更好,请随时提出一些完全不同的建议。
您需要'dynamic_cast',但是您真正想要的是变体类型。 – juanchopanza
是的,我知道我需要做一个动态转换为父类型。问题是,如果不以硬编码的方式测试每种类型,我无法确定要投射到哪种类型。最后,我基本上需要能够确定数据的大小,比如向量中元素的数量或字符串的长度;这些成员函数根据类型进行更改。我想过一个模板,只是假设T :: size存在,但如果函数的行为在类型之间有不同的定义,则可能会有风险。 –
如果您需要确定数据的“大小”,如何将'virtual std :: size_t size()const = 0;'添加到'Child'? – aschepler