提升MPL类型与模板

时间:2016-03-22 16:16:32

标签: c++ templates boost

我对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;

但如果我添加&#34; :: type&#34;对于大小计算的结果,如下所示:

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

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

然后我得到错误&#34;错误:nontype&#34; boost :: mpl :: size :: type [with Sequence = mySequence]&#34;不是类型名称&#34;。

这是不是因为它在嵌套命名空间中而推断出模板参数的情况吗?令我困惑的是以下事实:

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;

我为什么要这样做&#34;输入:: type :: value&#34;在那里,但不是&#34;尺寸&lt; mySequence&GT; ::类型&#34;在线之前?

1 个答案:

答案 0 :(得分:3)

您遇到此错误的原因是您需要使用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定义为某种特殊化的类型,那么如果使用这种特化,你会有一个有趣的编译错误!