c++ - 如何在不知道底层类型的情况下从模板化父类取回值?

标签 c++ templates polymorphism

出于说明目的,给出这些定义和一些代码:

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/

相关文章:

c++ - 为什么 Apple 的 Clang(来自 Xcode 5)为 arm64 制作 typeinfos private_extern?

c++ - 使用模板作为模板函数参数

c++ - 使用模板和虚函数的技巧

c++ - 对依赖基类成员的非限定访问导致 "A declaration of [x] must be available"

java - 向上转型;为什么我得到输出 11

c++ - 指向派生类对象的基类指针有哪些用例

C++ 将字符从 int append 到 std::string

c++ - fastcall真的更快吗?

c++ - 来自模板类的模板参数的 typedef 是不可见的

java - 为什么我的多态父类从自身内部调用子类方法?