gpt4 book ai didi

c++ - 使用 boost mpl 插入器迭代器的意外结果

转载 作者:太空狗 更新时间:2023-10-29 21:06:55 25 4
gpt4 key购买 nike

我曾预计以下会给出相同的结果:

namespace mpl = boost::mpl;

template<int from, int to>
struct
make_vector1
: mpl::copy<
mpl::range_c<int,from,to>,
mpl::inserter<
mpl::vector<>,
mpl::push_back<mpl::placeholders::_1,
mpl::placeholders::_2 // <- Copy int_ types
>
>
>
{};

template<int from, int to>
struct
make_vector2
: mpl::copy<
mpl::range_c<int,from,to>,
mpl::inserter<
mpl::vector<>,
mpl::push_back<mpl::placeholders::_1,
mpl::int_<mpl::placeholders::_2::value> // <- Alternative?
>
>
>
{};

但他们没有。

int
main (int ac, char **av)
{
typedef make_vector1<0,3>::type v1;
typedef make_vector2<0,3>::type v2;

//returns 0, as I would expect
std::cout<<"I1 = "<<mpl::at<v1,mpl::int_<0> >::type::value <<std::endl;

//returns 2, which has me stumpted.
std::cout<<"I2 = "<<mpl::at<v2,mpl::int_<0> >::type::value <<std::endl;
}

知道这里发生了什么吗?

我想用第二种方法构造一个Example类型的mpl::vector,其中:

template<int i>
struct Example : mpl::int_<i>
{};

但我无法让它工作。

非常感谢

最佳答案

你得到 2 因为 _2 上的::value 被定义为 2(占位符索引)。出于显而易见的原因,MPL 不在占位符上定义::,因此您不能直接这样做。

现在,如您所见,访问 mpl::range_c 中的元素已经为您提供了一个 mpl::int_,因此无需尝试提取数值以将其放回。 mpl 序列迭代的抽象为您完成。

对于您的实际使用,您可以使用元函数获取 mpl::int_ 并返回您的示例。你必须明白,没有合适的通用元编程或元 lambda 函数可以用整数类型完成,因此 mpl::int_ 抽象:

#include <boost/mpl/at.hpp>
#include <boost/mpl/copy.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/push_back.hpp>

namespace mpl = boost::mpl;

template<int I> struct Example : boost::mpl::int_<I>
{
static void foo() { std::cout << "**" << I << "**\n";}
};

template<class T> struct make_example
{
typedef Example<T::value> type;
};

template<int from, int to>
struct
make_vector2
: mpl::copy<
mpl::range_c<int,from,to>,
mpl::inserter<
mpl::vector<>,
mpl::push_back<mpl::placeholders::_1,
make_example<mpl::placeholders::_2> // <- Alternative?
>
>
>
{};

int main(int ac, char **av)
{
typedef make_vector2<0,3>::type v2;

mpl::at<v2,mpl::int_<0> >::type::foo();
}

我添加 foo() 只是为了评估我们在调用 at 后进入正确的类类型。

让我们回顾一下:

  • 积分模板参数不可靠,这就是 MPL 使用 int_ 的原因。每个整数常量序列实际上已经返回 int_ 以保持抽象级别。
  • 占位符有一个用于内部用途的::值,因此是您的初始结果
  • 任何元函数都可以通过用占位符实例化来转换为 lambda。

关于c++ - 使用 boost mpl 插入器迭代器的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6385221/

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