出于说明目的,给出这些定义和一些代码:
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!
}
我如何从这里的基类中确定父类中使用的类型?
我正在处理的具体场景实际上是我有一堆 SqlParameterBase
包含有关存储过程的 SQL 参数的信息的类和 SqlParameter<T>
应该包含在 std::vector<std::unique_ptr<SqlParameterBase>>
中的模板并传递给表示存储过程配置的类,以便可以调用它。
但这里的根本问题是我需要访问底层数据并且我想避免定义 void *
在基类中包含指向数据的指针。我希望它的类型尽可能安全。
我也对解决此问题的替代设计或方法持开放态度,因此如果您觉得更好,请随时提出完全不同的建议。
最佳答案
您需要仅存在于派生类型中的子 promise 功能(返回类型化数据)。在继承下,这是抽象功能。所以一组推测性的虚拟访问器。这里实际上不需要向上转换。
我会说。如果您不希望 Child promise 返回什么,只是返回 something 那么您的接口(interface)似乎太宽泛,您将接口(interface)放在使用接口(interface)的代码中,比如与投机 Actor 等
可以通过在 Child 中定义的接口(interface)与一组 Child 进行交互,或者它们具有一些仅在 Derived 中可用的特殊功能,并且必须以这种方式使用。
作为补充,您可以考虑 std::vector<std::variant<type1, type2, ...>>
而不是完全破坏容器中的类型信息? std::variant 是 C++17 ofc,因此可能不合适,但有第 3 方实现 - boost 变体等。
关于c++ - 如何在不知道底层类型的情况下从模板化父类取回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43506562/