gpt4 book ai didi

c++ - 用自己的函数转换 mpl vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:11 25 4
gpt4 key购买 nike

我想将 mpl::vector 中的每个元素相乘通过 int .首先,一个将 int_ 相乘的元函数用int .

template <int i>
struct multiply_scalar
{
template<typename T> struct apply
{
typedef int_<(T::value * i)> type;
};
};

这是我要调用的电话。

typedef vector<int_<3>, int_<4> > my_vec;
typedef typename transform< my_vec, multiply_scalar<2> >::type my_vec_2;

typedef vector<int_<6>, int_<8> > my_vec_3;

BOOST_MPL_ASSERT(( boost::is_same< my_vec_2, my_vec_3 > )); //Fails
//type of my_vec2 is: boost::mpl::v_item<mpl_::int_<8>, boost::mpl::v_item<mpl_::int_<6>, boost::mpl::vector0<mpl_::na>, 0>, 0>

为什么生成的 vector 不是简单的 vector<int_<6>, int_<8>> ?我是不是抱错了?可能未以正确的方式应用元函数或转换。

最佳答案

主要是因为C++03的一些实现问题,MPL的编写者必须使用非显而易见的技术来表示序列,其中之一是类型的使用,如

boost::mpl::vector0<>
boost::mpl::vector1<T>
boost::mpl::vector2<T, U>
... etc

而不是简单的写

boost::mpl::vector<>
boost::mpl::vector<T>
boost::mpl::vector<T, U>

就像在 C++11 及更高版本中使用可变参数模板一样。另一种技术是在 vector 中插入东西时创建某种反向链接列表,这就是您在示例中看到的内容:

boost::mpl::v_item<mpl_::int_<8>, // 2nd element
boost::mpl::v_item<mpl_::int_<6>, // 1st element
boost::mpl::vector0<mpl_::na>, 0>, 0> // empty list

因此,documentation对于 boost::mpl::transform没有确切地指定 boost::mpl::transform<s,op,in>::type 的类型是什么.实际上,它只保证它是一个等价于

的类型
typedef lambda<op>::type f;
typedef lambda<in::operation>::type in_op;

typedef fold<
s
, in::state
, bind< in_op, _1, bind<f, _2> >
>::type r; // <-- the return type is equivalent to this r

这可能对你没有帮助,除非你已经足够了解 MPL你不会问关于它的问题 ;-) 所以基本上这意味着它返回一种类似于 boost::mpl::vector 的新类型,除了它的实际类型可能就像我上面展示的那样。特别是,这种类型保证是一个模型的 Forward Sequence概念。

当您使用 boost::is_same<T, U> 时,你实际上是在问是否 TU完全是相同的类型。你现在应该清楚为什么这不是什么你真的想要。相反,您想对这些进行某种深度比较两个序列,它们都代表 vector 。检查两个Forward序列相等,必须使用 boost::mpl::equal 算法代替。以下将起作用:

#include <boost/mpl/assert.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/mpl/vector.hpp>


using namespace boost::mpl;
template <int i>
struct multiply_scalar
{
template<typename T> struct apply
{
typedef int_<(T::value * i)> type;
};
};

typedef vector<int_<3>, int_<4> > my_vec;
typedef transform< my_vec, multiply_scalar<2> >::type my_vec_2;

typedef vector<int_<6>, int_<8> > my_vec_3;

BOOST_MPL_ASSERT(( boost::mpl::equal< my_vec_2, my_vec_3 > ));

关于c++ - 用自己的函数转换 mpl vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26672171/

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