gpt4 book ai didi

c++ - 使用 boost::mpl::iter_fold 并从 boost::mpl::map 获取键的 boost::mpl::vector

转载 作者:行者123 更新时间:2023-11-28 03:16:26 29 4
gpt4 key购买 nike

我正在尝试使用 boost.mpl 编写一个小型元程序,该程序使用两个 channel 映射将“命名 channel ”与音频格式相匹配。

名称也是一个整数(枚举)。我试图在运行时实现的一个简单示例可能如下所示:

typedef int Name;
std::map<int, int> map_channels(const std::map<int, Name>& m1, const std::map<Name, int>& m2)
{
std::map<int, int> result;
for (std::map<int, Name>::const_iterator it = m1.begin(); it != m1.end(); ++it)
{
result[it->first] = m2.find(it->second)->second; // Ignoring errors for example
}
return result;
}

int main()
{
std::map<int, Name> m1;
m1[0] = 20;
m1[1] = 22;
m1[2] = 21;

std::map<Name, int> m2;
m2[19] = 1;
m2[20] = 2;
m2[21] = 0;
m2[22] = 3;

std::map<int, int> m3 = map_channels(m1, m2);
for (std::map<int, int>::iterator it = m3.begin(); it != m3.end(); ++it)
{
std::cerr << it->first << ":" << it->second << std::endl;
}
return 0;
}

我正在尝试使用 boost.mpl 编写一个编译时版本,到目前为止有类似的东西:

typedef map<
pair<int_<0>, int_<20> >
, pair<int_<2>, int_<22> >
, pair<int_<3>, int_<21> >
> m1;

typedef map<
pair<int_<19>, int_<1> >
, pair<int_<20>, int_<2> >
, pair<int_<21>, int_<0> >
, pair<int_<22>, int_<3> >
> m2;

我想做的是从其他两张 map 创建第三张 map ,如下所示:

typedef map<
pair<int_<0>, int_<2> >
, pair<int_<2>, int_<3> >
, pair<int_<3>, int_<0> >
> mapping;

我尝试了以下想法:

// TODO : Dont know how to obtain a vector of keys from a mpl map
typedef vector<int_<0>, int_<2>, int_<3> > m1_keys;
//typedef transform<m1, first<_1> >::type m1_keys; // This does not work. I tried a number of ideas and none worked

// Create the composed function that given a key for m1, looks up the value and then uses that value as a lookup to m2
// This is working fine.
typedef at<m2, at<m1, _1> > composed_m1_m2_expr;
typedef lambda<composed_m1_m2_expr>::type composed_m1_m2_lambda;

// TODO : This fold is no good eithre.
typedef iter_fold<m1_keys, map<>, insert<_1, pair<deref<_2>, apply<composed_m1_m2_lambda, _2 > > > >::type mapping;

注意:我正在打印这些东西的值,例如:

struct print_iipair
{
template <typename data_tpt>
void operator()(data_tpt p)
{
(void)p;
std::cerr << "k: " << data_tpt::first::value << ", v: " << data_tpt::second::value << std::endl;
//std::cerr << "value: " << typeid(p).name() << std::endl;
}
};

struct print_value
{
template <typename data_tpt>
void operator()(data_tpt p)
{
(void)p;
std::cerr << "value: " << data_tpt::value << std::endl;
//std::cerr << "value: " << typeid(p).name() << std::endl;
}
};
...
for_each<m1_keys,_>(print_value());
for_each<mapping,_>(print_iipair());

我的问题是:

1) 我如何创建包含 boost::mpl::map 键的 boost::mpl::vector?

2) 我将如何实现这个 iter_fold?我认为问题出在应用和使用的 _2 上,但不确定如何解决这个问题

谢谢。

最佳答案

事实证明,解决方案是使用 mpl::fold 而不是 mpl::transform,因为您无法转换 mpl::map,因为它会生成与源序列类型相同的容器并使用 mpl::push_back 构造它不适用于 map 。

我的两个似乎有效的解决方案是:

1) 我如何创建一个包含 boost::mpl::map 键的 boost::mpl::vector?

// Get a mpl::vector containing just the keys from the map m1
typedef fold<m1, vector<>, push_back<_1, first<_2> > >::type m1_keys;

2) 我将如何实现这个 iter_fold?

// Create a mapping
typedef at<m2, at<m1, _1> > composed_m1_m2_expr;
typedef lambda<composed_m1_m2_expr>::type composed_m1_m2_lambda;
typedef fold<m1_keys, map<>, insert<_1, pair<_2, composed_m1_m2_lambda::apply<_2> > > >::type mapping;

关于c++ - 使用 boost::mpl::iter_fold 并从 boost::mpl::map 获取键的 boost::mpl::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16734638/

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