gpt4 book ai didi

c++ - 在不带参数的可变参数模板中迭代

转载 作者:行者123 更新时间:2023-11-30 02:26:31 25 4
gpt4 key购买 nike

我有一个数据对象“value”,它可以包含不同类型的值(int、std::string、bool 等)。我想使用可变参数模板将其反序列化为元组:

tuple<int, std::string, bool> tuple = data.Deserialize<int, std::string, bool>();

在我的 Deserialize 方法中,我想遍历类型(这里是 int、std::string 和 bool),以便每次调用另一个知道如何获取数据的 Deserialize 方法。

这可能吗?

最佳答案

Is it possible ?

是的。


这是一个 C++17 解决方案:

template <typename T>
struct type_wrapper { using type = T; };

template <typename... Ts, typename TF>
void for_types(TF&& f)
{
(f(type_wrapper<Ts>{}), ...);
}

用法:

for_types<int, std::string, bool>([](auto t)
{
using t_type = typename decltype(t)::type;
// logic for type `t_type` ...
});

live wandbox example


这是一个 C++11 解决方案:

template <typename TF, typename... Ts>
void for_each_arg(TF&& f, Ts&&... xs)
{
using swallow = int[];
return (void)swallow{(f(std::forward<Ts>(xs)), 0)...};
}

template <typename T>
struct type_wrapper { using type = T; };

template <typename... Ts, typename TF>
void for_types(TF&& f)
{
for_each_arg(std::forward<TF>(f), type_wrapper<Ts>{}...);
}

用法:

struct body
{
template <typename T>
void operator()(type_wrapper<T>) const
{
// logic for type `T` ...
}
};

int main()
{
for_types<int, float, bool>(body{});
}

live wandbox example


如果您不需要迭代一系列类型的通用方法,您可以直接在 Deserialize 定义中应用 for_types 中介绍的技术。

关于c++ - 在不带参数的可变参数模板中迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42765118/

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