如何扩展可变参数模板类

j

简化我正在尝试以下操作:

template<typename T>
struct SomeObject
{
    T value;
};

template<typename... Ts>
struct Container : public SomeObject<Ts>...
{
    void init()
    {
        (initObject<Ts>())...; // not working: how to execute initObject for each type
    }

    template<typename T>
    void initObject()
    {
        SomeObject<T>::value = new T();
        // do some other stuff
    }
};

class A {};
class B {};

int main()
{
    auto c = new Container<A, B>();
    c->init();
}

在我的用例中,我无法在构造函数中进行初始化。那么,如何获得init针对所有类型正确展开方法?

斯帕里克

在c ++ 17中,您可以使用逗号运算符上的fold表达式来完成此操作

(initObject<Ts>(), ...);

在c ++ 17之前,您可以做类似的事情

std::initializer_list<int>{(initObject<Ts>(), 0)...};

请注意在初始化列表中的逗号表达式。那是因为initObject回报void,你不能有一个initializer_listvoid小号

这是另一个更通用的解决方案。对于这种情况,它太复杂了,但可能很有用。

template<typename... Ts>
struct Container : public SomeObject<Ts>...
{
    void init()
    {
        initObjects<Ts...>(); // not working: how to execute initObject for each type
    }

    template <typename ...Args>
    struct object_initializer;

    template <typename First, typename ...Rest>
    struct object_initializer<First, Rest...> {
        void operator ()() {
            SomeObject<First> obj{First()};
            object_initializer<Rest...>()();
        }
    };

    template <typename First>
    struct object_initializer<First> {
        void operator ()() {
            SomeObject<First> obj{First()};
        }
    };

    template<typename ...Args>
    void initObjects() {
        object_initializer<Args...>()();
    }
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章