C++ 如何利用向量的变换构造元组';s迭代
目前,我遇到了一个将类似json的类转换为元组的问题。核心问题是将变量向量转换为特定类型的元组C++ 如何利用向量的变换构造元组';s迭代,c++,templates,variadic-templates,C++,Templates,Variadic Templates,目前,我遇到了一个将类似json的类转换为元组的问题。核心问题是将变量向量转换为特定类型的元组 using v_t = variant<int, double, string> using raw_t = vector<v_t> ; template <typename... args> optional<tuple<args...>> try_get_value(const raw_t& input); 使用v_t=vari
using v_t = variant<int, double, string>
using raw_t = vector<v_t> ;
template <typename... args>
optional<tuple<args...>> try_get_value(const raw_t& input);
使用v_t=variant
使用原始t=向量;
模板
可选的try_get_值(常量原始值和输入值);
try_get_value函数的实现如下
if input.size() != sizeof...(args) return nullopt
for i in xrange(sizeof...(args)):
if !input[i].holds_alternative<args[i]> return nullopt
return make_tuple(input[i].get<args[i]>()...)
如果输入.size()!=sizeof…(参数)返回nullopt
对于x范围内的i(sizeof…(args)):
如果!输入[i]。保留\u可选返回null选项
返回make_元组(输入[i].get()…)
例如,我有data=vector({v_t(1),v_t(2)})
,我想从这个数据中得到tuple
,所以我调用try_-get-value(data)
,它应该返回make_-tuple(1,1)
,但如果我调用try_-get-value(data)
,它应该返回nullopt。这些参数类型是手动提供的,在变量向量中可能不同
我花了将近半天的时间试图构建函数体,但失败了。有什么想法吗?是的,是的,你可以
template <class... Requested, std::size_t... RequestedIdx>
std::optional<std::tuple<Requested...>> try_get_value(
raw_t const &input, std::index_sequence<RequestedIdx...>
) {
// At least one of the variant contains an unexpected type, bail out
if(!(std::holds_alternative<Requested>(input[RequestedIdx]) && ...))
return {};
return std::optional<std::tuple<Requested...>>(
std::in_place, std::get<Requested>(input[RequestedIdx])...
);
}
template <class... Requested>
std::optional<std::tuple<Requested...>> try_get_value(raw_t const &input) {
// Incorrect vector size, bail out
if(input.size() != sizeof...(Requested))
return {};
return try_get_value<Requested...>(input, std::index_sequence_for<Requested...>{});
}
模板
std::可选的try\u get\u值(
原始常数和输入,标准::索引序列
) {
//至少有一个变量包含意外类型bail out
如果(!(std::holds_alternative(输入[RequestedIdx])&&&…)
返回{};
返回标准::可选(
std::in_place,std::get(输入[RequestedIdx])。。。
);
}
模板
std::可选的try\u get\u值(原始常量和输入){
//向量大小不正确,请退出
if(input.size()!=sizeof…(请求))
返回{};
返回try_get_值(输入,{}的std::index_序列_);
}
您计划如何在运行时实际提供模板参数?这是不可能的,因为模板是在编译时实例化的。你最终想要达到什么目标?听起来像是XY问题。现在你有什么代码?我认为这是不可能的,因为当前类型的<代码>变体<代码>是在运行时确定的,而<>代码> tuple < /Cuth>成员——编译时。@每个人只是在C++中不可能做到这一点并不意味着你必须关闭这个问题。“不清楚你在问什么”。我认为很明显你在问什么(我们有三条评论表明了这一点)args
是数据的预期类型,但数据是从输入构造的,因此args
可能与数据不匹配,因此我返回可选的。似乎是对的!那些varaidic模板魔术!我现在凌晨1点,我会在早上检查。@spiritsaway好的,晚安:p