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() 有什么建议吗?谢谢。
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)
| 归档时间: |
|
| 查看次数: |
4260 次 |
| 最近记录: |