gpt4 book ai didi

c++ - 将变体数组转换为 std::tuple

转载 作者:行者123 更新时间:2023-11-28 03:40:16 25 4
gpt4 key购买 nike

我正在为用 C 实现的变体类型开发 C++11 包装器。变体类型支持常见数据类型,如 int、float、string,但也支持元组。我有表单基本类型的转换器...

template<typename T>
T convert_to(const Variant &var);

...但我正在努力转换为 std::tuple。

底层 C API 可以通过返回变体数组来分解元组。它看起来像这样:

int get_tuple(Variant var, Variant **argv, int *argc);

现在我认识到我可以为每种大小的元组手动创建模板,但我正在寻找可以处理任何大小的元组的可变参数解决方案。有关如何处理此问题的任何提示?

顺便说一句,我要包装的实际内容是 Erlang NIF API。

最佳答案

由于您使用的是 C++11(并且您知道模板参数中的元组类型),因此您可以愉快地使用可变参数模板。像*

template <class ... Ts>
std::tuple<Ts...> convert_to(const Variant& v)
{
Variant tmp_array[std::tuple_size<std::tuple<Ts...>>::value];
get_tuple(v, tmp_array, sizeof(tmp_array)/sizeof(tmp_array[0]));
std::tuple<Ts...> ret;
array_to_tuple(ret, tmp_array);
return ret;
}

其中 array_to_tuple 将逐一复制元素:

template <class ... Ts>
struct array_to_tupler
{
template <int I>
static void do_it(std::tuple<Ts...> &t, Variant* vs)
{
std::get<I-1>(t) = convert_to<decltype(std::get<I-1>(t))>(vs[I-1]);
do_it<I-1>(t, vs);
}
template <>
static void do_it<0>(std::tuple<Ts...> &t, Variant* vs)
{
}
};

template <int N, class ... Ts>
void array_to_tuple(std::tuple<Ts...> &t, Variant (&vs)[N])
{
array_to_tupler<Ts...>::do_it<N>(t, vs);
}

希望这能奏效...

*) 请注意,这样的 convert_to 将不容易调用。我建议使用类模板对返回类型进行特化,因为您需要部分特化,而函数模板不能。

关于c++ - 将变体数组转换为 std::tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com