将可变参数模板参数解压到初始值设定项列表中

Ju *_*onn 5 c++ templates variadic-templates c++11

我目前正在尝试实现一个通用初始化程序以减少代码库的大小。然而,在某一时刻,我的代码看起来像这样:

template<typename T, typename Arg1, typename Arg2>
T* ManageDevice(Arg1 arg1, Arg2 arg2)
{
    auto device = new T{ arg1, arg2 };
    // More operations on device
    return device;
}

template<typename T, typename Arg1, typename Arg2, typename Arg3>
T* ManageDevice(Arg1 arg1, Arg2 arg2, Arg3 arg3)
{
    auto device = new T{ arg1, arg2, arg3 };
    // More operations on device
    return device;
}

template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
T* ManageDevice(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
{
    auto device = new T{ arg1, arg2, arg3, arg4 };
    // More operations on device
    return device;
}
Run Code Online (Sandbox Code Playgroud)

这开始变得不那么优雅了。根据我的理解,可变参数模板似乎是解决这个问题的方法。但我不明白这如何应用于我的情况。

我更喜欢这样的东西:

T* ManageDevice(Args... args)
{
    // The function I want
    // Unpack as a std::initializer_list
    auto allArguments = unpackAll(); 

    auto device = new T{ allArguments };
    // More operations on device
    return device;
}
Run Code Online (Sandbox Code Playgroud)

关于如何实现 unpackAll() 有什么建议吗?谢谢。

Nat*_*ica 4

auto device = new T{ allArguments };
Run Code Online (Sandbox Code Playgroud)

只是需要

auto device = new T{ args... };
Run Code Online (Sandbox Code Playgroud)

将为您T{ args... } args...扩展参数包。arg0, arg1, ..., argn

你可以看到这个与

template <typename... Args>
std::vector<int> make_vector(Args... args)
{
    return {args...};
}

int main()
{
    auto foo = make_vector(1,2,3,4);
    for (auto e : foo)
        std::cout << e << " ";
}
Run Code Online (Sandbox Code Playgroud)

编辑添加完美转发版本

template <typename... Args>
std::vector<int> make_vector(Args&&... args)
{
    return {std::forward<Args>(args)...};
}
Run Code Online (Sandbox Code Playgroud)