提升MPL类型与模板

Boost MPL Types Vs Templates

本文关键字:类型 MPL 提升      更新时间:2023-10-16

我对Boost MPL(以及一般的元编程)还很陌生,我想我对模板与类型的概念感到困惑。我正在处理的一个简单的例子是试图计算向量的长度。以下编译良好:

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;

然后我得到错误"error:notype"boost::mpl::size::type[withSequence=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,以及如何为mySequence指定mpl::size。默认情况下,它假定不是类型。所以你需要提示一下。

现在你可能已经理解了为什么type::type::value工作得很好了——默认情况下,编译器认为value不是一个类型,你并没有试图将其用作类型,编译器很高兴。顺便说一句,如果您将value定义为某个专门化的类型,如果使用此专门化,您将出现一个有趣的编译错误!