gpt4 book ai didi

c++ - 在 C++11 中将(1 元组到 10 元组)参数转换为 n 元组参数

转载 作者:太空狗 更新时间:2023-10-29 23:52:55 27 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Pretty-print std::tuple

在数据库库 (soci) 中,下面有一段代码适用于 std::tuple<>。从一到十个参数。

静态类方法 from_base()to_base()为 1 元组到 10 元组的参数实现。

guts 本质上是将每个 n 元组元素传入和传出传入的流。一切都是硬编码的。

如何将此代码转换为使用 C++11 的可变参数模板(对参数没有限制)?是否实际使用可变参数模板是次要的。我们真正想做的是用 n 元组参数的一般情况替换硬编码。

部分问题是,从技术上讲,只有一个参数,但该参数是一个 n 元组,所以我不能完全使用描述的内容 here in Wikipedia .什么是最好的方法?

#include "values.h"
#include "type-conversion-traits.h"
#include <tuple>

namespace soci
{

template <typename T0>
struct type_conversion<std::tuple<T0> >
{
typedef values base_type;

static void from_base(base_type const & in, indicator ind,
std::tuple<T0> & out)
{
in
>> std::get<0>(out);
}

static void to_base(std::tuple<T0> & in,
base_type & out, indicator & ind)
{
out
<< std::get<0>(in);
}
};

template <typename T0, typename T1>
struct type_conversion<std::tuple<T0, T1> >
{
typedef values base_type;

static void from_base(base_type const & in, indicator ind,
std::tuple<T0, T1> & out)
{
in
>> std::get<0>(out)
>> std::get<1>(out);
}

static void to_base(std::tuple<T0, T1> & in,
base_type & out, indicator & ind)
{
out
<< std::get<0>(in)
<< std::get<1>(in);
}
};

// ... all the way up to 10 template parameters

}

RUNNABLE ANSWER(基于下面 Grizzly 的帖子)

#include <iostream>
#include <tuple>

using namespace std;

// -----------------------------------------------------------------------------

template<unsigned N, unsigned End>
struct to_base_impl
{
template<typename Tuple>
static void execute(Tuple& in, ostream& out)
{
out << std::get<N>(in) << endl;
to_base_impl<N+1, End>::execute(in, out);
}
};

template<unsigned End>
struct to_base_impl<End, End>
{
template<typename Tuple>
static void execute(Tuple& in, ostream& out)
{
out << "<GAME OVER>" << endl;
}
};

// -----------------------------------------------------------------------------

template <typename Tuple>
struct type_conversion
{
static void to_base(Tuple& in, ostream& out )
{
to_base_impl<0, std::tuple_size<Tuple>::value>::execute(in, out);
}
};

template <typename... Args>
struct type_conversion<std::tuple<Args...>>
{
static void to_base(std::tuple<Args...>& in, ostream& out )
{
to_base_impl<0, sizeof...(Args)>::execute(in, out);
}
};

// -----------------------------------------------------------------------------

main()
{
typedef tuple<double,int,string> my_tuple_type;
my_tuple_type t { 2.5, 5, "foo" };

type_conversion<my_tuple_type>::to_base( t, cerr );
}

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