gpt4 book ai didi

c++ - 如何读取元组?

转载 作者:行者123 更新时间:2023-11-28 06:52:10 26 4
gpt4 key购买 nike

代码如下。看起来很简单,但是会出现一些我找不到错误的编译错误。

#define ENABLE_IF(Condition, Type) typename enable_if < (Condition), Type>::type

template<size_t I = 0, class... Ts>
ENABLE_IF(I == sizeof...(Ts), void) read(QDataStream& in, tuple<Ts...>& t)
{}

template<size_t I = 0, class... Ts>
ENABLE_IF(I < sizeof...(Ts), void) read(QDataStream& in, tuple<Ts...>& t)
{
in >> std::get<I>(t);
read<I + 1>(in, t);
}

lat 语句错误:error C2770: invalid explicit template argument(s) for 'enable_if<I<0x01,void>::type read(QDataStream &,std::tuple<_Types1...> &)'

经过多次测试,发现下面的代码是可以的

template<size_t I = 0, class Tuple>
ENABLE_IF(I == tuple_size<Tuple>::value, void) read(QDataStream& in, Tuple& t)
{}

template<size_t I = 0, class Tuple>
ENABLE_IF(I < tuple_size<Tuple>::value, void) read(QDataStream& in, Tuple& t)
{
in >> std::get<I>(t);
read<I + 1>(in, t);
}

这使用元组类型作为模板参数而不是其元素类型包。是什么原因? VS2013 的编译错误?

与其他编译器一起测试。原码没问题。我认为这是一个 VS2013 错误。 :-(

最佳答案

非常简单!您的主要模板没有只有一个参数。您只需传递第二个参数 Ts...:

read<I + 1, Ts...>(in, t);

和倒序阅读

#include <iostream>
#include <sstream>
#include <tuple>

template<size_t I, typename... Ts>
struct reader
{
static void read(std::istream& i, std::tuple<Ts...>& t)
{
i >> std::get<I>(t);
reader<I - 1, Ts...>::read(i, t);
}
};

template<typename... Ts>
struct reader<0, Ts...>
{
static void read(std::istream& i, std::tuple<Ts...>& t)
{
i >> std::get<0>(t);
}
};

template<typename... Ts>
void read(std::istream& i, std::tuple<Ts...>& t)
{
reader<sizeof...(Ts) - 1, Ts...>::read(i, t);
}

int main()
{
std::istringstream istr("1 2");
std::tuple<int, double> t;
read(istr, t);
}

关于c++ - 如何读取元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23745333/

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