gpt4 book ai didi

c++ - 如何创建具有 N 种不同类型的变量成员的模板类,以便

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

这是我想要实现的:

一个模板类,它有N个变量成员,每个成员可能有不同的类型。此外,此类可以在外部获取 N 个函数/仿函数,以便每个仿函数将更新具有相应类型的成员变量。理想情况下,我希望 N 是未知的,这意味着我们需要 Variadic 模板。

这是 N=2 的示例(理想情况下,我希望它是仿函数而不是函数,但我在那里也遇到了一些困难。)

template<typename T1, typename T2>
class TwoInput
{
public:
TwoInput(T1 (*f1)(), T2 (*f2)()) : _f1(f1), _f2(f2) {};
void run(){
t1 = (*_f1)();
t2 = (*_f2)();
};
void output(){std::cout<<_t1<<std::endl; std::cout<<_t2<<std::endl;};
protected:
T1 _t1;
T2 _t2;
T1 (*_f1)();
T2 (*_f2)();
};

最佳答案

从数据的 std::tuple 开始。

然后改变类型以创建函数的 std::tuple

然后编写一个函数,将函数的std::tuple应用到数据的std::tuple

#include <utility>

template< template<typename>class Typemap, typename Tuple>
struct map_types;
template< template<typename>class Typemap, template<typename...>class pack, typename... Args>
struct map_types< Typemap, pack<Args...> > {
typedef pack< Typemap<Args>... > type;
};

template< template<typename>class Typemap, typename Tuple>
using MapTypes = typename map_types<Typemap, Tuple>::type;

template< typename T >
using NullaryFuncReturning = T(*)();

template<int...> struct seq {};
template<int max, int... s> struct make_seq:make_seq<max-1, max-1, s...> {}:
template<int... s> struct make_seq<0,s...>:seq<s...> {};

void do_in_order() {}
template<typename F0, typename... Fs>
void do_in_order( F0&& f0, Fs&&... fs ) {
std::forward<F0>(f0)();
do_in_order( std::forward<Fs>(fs)... );
}

template< int... s, typename Funcs, typename Data >
void pairwise_apply_helper( seq<s...>, Funcs&& funcs, Data&& data ) {
do_in_order( [&]{ std::get<s>(data) = std::get<s>( funcs )() }... );
}
template< typename... Funcs, typename... Data >
void pairwise_apply( std::tuple<Funcs...> funcs, std::tuple<Data...>& data ) {
pairwise_apply_helper( make_seq<sizeof...(Funcs)>, std::move(funcs), data );
}

typedef std::tuple<int, double, int> data_type;
MapTypes< NullaryFuncReturning, data_type > func_type;

int seven() { return 7; }
double approx_pi() { return 3.14; }

data_type data;
func_type func{seven, approx_pi, seven};
#include <iostream>
int main() {
pairwise_apply( func, data );
}

或类似的东西(未经测试,我需要去 sleep )。

关于c++ - 如何创建具有 N 种不同类型的变量成员的模板类,以便,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204673/

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