正在将可变模板参数解包到初始值设定项列表中
Unpacking variadic template parameters into initializer list
我目前正在尝试实现一个通用的初始化器,以减少我们的代码库的大小。然而,有一次,我的代码看起来是这样的:
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;
}
这开始变得不那么优雅了。根据我的理解,可变模板似乎是解决这个问题的方法。但我不明白这怎么能适用于我的情况。
我更喜欢这样的东西:
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((,有什么建议吗?谢谢
auto device = new T{ allArguments };
只需要成为
auto device = new T{ args... };
在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 << " ";
}
编辑以添加完美的转发版本
template <typename... Args>
std::vector<int> make_vector(Args&&... args)
{
return {std::forward<Args>(args)...};
}
我的C++14答案,作为的最小工作示例
#include <initializer_list>
#include <utility>
#include <vector>
#include <type_traits>
#include <iostream>
struct example {
template <typename ...Args, typename T = std::common_type_t<Args...>>
static std::vector<T> foo(Args&& ...args) {
std::initializer_list<T> li{std::forward<Args>(args)...};
std::vector<T> res{li};
return res;
}
};
int main() {
std::vector<int> v1 = example::foo(1,2,3,4);
for(const auto& elem: v1)
std::cout << elem << " ";
std::cout << "n";
}
您需要根据自己的需要对其进行编辑,即对代码结构进行编辑。但请注意,vector
构造函数采用initializer_list
,该列表是从静态foo
方法中的参数包生成的。
编辑:在您的情况下,正如其他人所指出的,您可以直接将参数包转发到您的呼叫。我的回答显示将它们传递给initializer_list
。
所以事实上,你可以做
static std::vector<T> foo(Args&& ...args) {
std::vector<T> res{std::forward<Args>(args)...};
return res;
}
并且这些自变量将被隐式地转换为CCD_ 8。我明确地展示了参数包中initializer_list
的构造。
相关文章:
- 概念中的cv限定符需要表达式参数列表
- 在卡萨布兰卡形成编码参数的列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 列表参数的类型定义
- std::vector 没有重载函数的实例与参数列表匹配
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 构造函数/函数声明参数列表中的统一初始化
- 模板化检查是否存在带有参数列表的类成员函数?
- 没有函数模板的实例"max"与参数列表参数类型匹配(int、int)
- 具有泛型列表参数和委托的函数
- 海湾合作委员会拒绝列表参数的初始化
- 为什么初始化构造函数列表参数时会发生异常?
- 简单变量列表参数C++
- 具有列表参数C++11/C++14样式的求和函数
- c++初始化列表——参数来自构造函数体本身
- 一种更有效的处理循环内列表参数的方法