Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何利用向量的变换构造元组';s迭代_C++_Templates_Variadic Templates - Fatal编程技术网

C++ 如何利用向量的变换构造元组';s迭代

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

目前,我遇到了一个将类似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=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