gpt4 book ai didi

带有元组的 C++ 可变参数模板

转载 作者:行者123 更新时间:2023-11-30 01:18:37 24 4
gpt4 key购买 nike

我想写一个函数从二进制缓冲区中提取一些数据(假设数据是顺序存储的)。函数返回数据和提取数据后的指针,像这样

std::tuple<const unsigned char *, int, double, float> data = Extract<int, double, float>(p_buffer);

它从 p_buffer 中提取一个 int、一个 double 和一个 float 数字,以及第一个值data 指示下一次提取工作从哪里开始。

我试着写这样的东西。

#include <tuple>

typedef unsigned char byte;

template<class TFirst, class... TRest>
struct Extractor
{
static std::tuple<const byte *, TFirst, TRest...> Extract(const byte *p_current)
{
TFirst first_value;
TRest... rest_values; // Not working.

std::tie(p_current, first_value) = Extractor<TFirst>::Extract(p_current);
std::tie(p_current, rest_values...) = Extractor<TRest...>::Extract(p_current);

return std::make_tuple(p_current, first_value, rest_values...);
}
};

template<class T>
struct Extractor<T>
{
static std::tuple<const byte *, T> Extract(const byte *p_current)
{
return std::make_tuple(p_current + sizeof(T), *reinterpret_cast<const T *>(p_current));
}
};

它没有编译,因为“参数包不能在此上下文中扩展”。我听说函数模板不能部分特化,所以我使用结构。如何让它发挥作用?

最佳答案

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

#include <tuple>
#include <type_traits>

typedef unsigned char byte;

template <class Type>
void ExtractValue(const byte*& p_current, Type& value)
{
value = *reinterpret_cast<const Type*>(p_current);
p_current += sizeof(Type);
}

template <size_t index, class... Types>
typename std::enable_if<index == sizeof...(Types)>::type
ExtractImpl(const byte*& p_current, std::tuple<Types...>& values)
{}

template <size_t index, class... Types>
typename std::enable_if<(index < sizeof...(Types))>::type
ExtractImpl(const byte*& p_current, std::tuple<Types...>& values)
{
ExtractValue(p_current, std::get<index>(values));
ExtractImpl<index + 1>(p_current, values);
}

template <class... Types>
std::tuple<Types...> Extract(const byte *p_current)
{
std::tuple<Types...> values;

ExtractImpl<0>(p_current, values);

return values;
}

此解决方案不会将 p_current 添加到返回的元组中,但您可以轻松修复它。

关于带有元组的 C++ 可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22456415/

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