c++ -从其他对象继承std::元组,并为其添加虚函数

C++ - inherting std::tuple from something adding virtual functions to it

本文关键字:添加 函数 元组 其他 对象 继承 c++ std      更新时间:2023-10-16

首先是否可以从某些东西继承std::元组?

我有

std::tuple<A, B> // (common base event data)
std::tuple<C, D, E> someObj;

所以如果我构造第二个元组,第一个基类(或类似的东西)也应该涉及。

其次,我认为更重要的是,在运行时,我希望根据我的类型选择正确的虚函数。

例如if

std::tuple<A,B> { virtual void Serialize(); }

我想能够特殊的子类的特化方法,但使用模板,所以它可以在编译时展开,但我可以选择在运行时的方法。

我正在考虑在代码中构建不同的问题,以便我可以实现这一点,但如果不是,我将不得不为每个元组诉诸手写的样板代码。

Tuple不会神奇地扩展您想要的其他元组。您可以提供自己的逻辑:

template<typename... Types>
using child_tuple = std::tuple<A, B, Types...>
template<typename... Args>
auto make_child_tuple(A a, B b, Args&&... args) {
    return child_tuple<std::decay_t<Args>...>{a, b, std::forward<Args>(args)...};
}

如果你想要元组上的虚函数(哦,不要),你将不得不引入你自己的结构体:

struct Interface {
    virtual void serialize() = 0;
};
template<typename... Types>
struct poly_child_tuple: Interface, child_tuple<Types...> {
    void serialize () override { /* ... */ }
};

但是,我强烈建议您以模板函数的形式为元组提供一个通用的序列化函数(请这样做):

template<typename... Types, std::size_t... S>
void serialize(std::index_sequence<S...>, const std::tuple<Types...>& tuple) {
    int unpack[] = {(static_cast<void>(
        [](auto&& value){
            // Do things for each `value` in `tuple`
        }(std::get<S>(tuple))
    ), 0)..., 0};
}
template<typename... Types>
void serialize(const std::tuple<Types...>& tuple) {
    serialize(std::index_sequence_for<Types...>{}, tuple);
}

然后,通过该实现,您可以直接调用已知类型的元组,也可以从虚方法调用它,这是您在问题中描述的。

下面是一个用法示例:

template<typename... Types>
struct serializable_tuple_impl : Interface {
    void serialize() override {
        ::serialize(tuple);
    }
private:
    child_tuple<Types...> tuple;
};