gpt4 book ai didi

c++ - boost MPL 类型与模板

转载 作者:行者123 更新时间:2023-11-28 00:05:07 25 4
gpt4 key购买 nike

我对 Boost MPL(以及一般的元编程)还很陌生,我想我对模板与类型的概念感到困惑。我正在使用的一个简单示例是尝试计算 vector 的长度。以下编译正常:

typedef mpl::vector_c< int, 0, 1, 2, 3, 4, 5, 6, 7 > myVector;

struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence> type;
};
};

typedef TestSize::apply<myVector>::type result;

但如果我将“::type”添加到大小计算的结果中,如下所示:

struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence>::type type;
};
};

typedef TestSize::apply<myVector>::type result;

然后我收到错误“错误:非类型“boost::mpl::size::type [with Sequence=mySequence]”不是类型名称”。

这是不是模板参数因为在嵌套的命名空间中而推导不出来的情况?让我更加困惑的是以下编译的事实:

struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence> type;
typedef mpl::range_c<int, 0, type::type::value> myRange;
};
};

typedef TestSize::apply<myVector>::type result;
typedef TestSize::apply<textureIndices>::myRange range;

为什么我可以在那里做“type::type::value”,而不能在之前的行上做“size< mySequence>::type”?

最佳答案

出现此错误的原因是您需要使用 typename像这样(在内部 apply ):

struct TestSize
{
template <typename mySequence> struct apply
{
typedef typename mpl::size<mySequence>::type type; // <-- here!
};
};

需要 typename在这种情况下,来自编译器编译模板的方式。当模板最初被预编译时,它需要在语义上是正确的。然而,编译器不知道(此时)mpl::size<mySequence>::type确实是一种类型。此时它不知道什么mySequence是,又如何mpl::size指定为 mySequence .默认情况下,它假定它不是一种类型。所以你需要提示一下。

现在你可能明白为什么了 type::type::value工作正常——编译器默认认为 value不是类型,您不会尝试将其用作类型,并且编译器很高兴。顺便说一句,如果你要定义 value作为特定特化的类型,如果使用该特化,您将遇到一个有趣的编译错误!

关于c++ - boost MPL 类型与模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36159731/

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