将可变参数模板参数解压缩到初始化程序列表中 [英] Unpacking variadic template parameters into initializer list

查看:60
本文介绍了将可变参数模板参数解压缩到初始化程序列表中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am currently trying to implement a general initializer to reduce the size of our codebase. At one point however, my code looked like this:

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;
}

哪个开始不那么优雅了.据我了解,可变参数模板似乎是解决此问题的方法.但是我不知道如何将其应用于我的情况.

Which starts to be less elegant. From my understanding, variadic templates seems to be the way to solve this issue. But I don't understand how this can be applied to my situation.

我更喜欢这样的东西:

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;
}

关于应如何实现unpackAll()的任何建议?谢谢.

Any suggestion on how unpackAll() should be implemented? Thanks.

推荐答案

auto device = new T{ allArguments };

只是需要

auto device = new T{ args... };

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

In T{ args... } args... will expand the parameter pack to arg0, arg1, ..., argn for you.

您可以看到它与之配合使用

You can see this working with

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 << " ";
}


编辑以添加完善的转发版本


Edit to add perfect forwarding version

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

这篇关于将可变参数模板参数解压缩到初始化程序列表中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆