提升MPL类型与模板
Boost MPL Types Vs Templates
我对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
定义为某个专门化的类型,如果使用此专门化,您将出现一个有趣的编译错误!
相关文章:
- 检查两个 Boost.MPL 序列是否按任何顺序包含相同的类型
- MPL地图实例化类型
- 如何在折叠过程中获取成员类型的提升::mpl 占位符
- Boost MPL-按顺序声明每种类型的类
- 获取 boost::variant 的类型索引与 boost::mpl
- 为boost mpl列表中的每种类型继承容器
- 从 boost::mpl:vector 类型列表中定义成员变量
- 提升MPL类型与模板
- 如何将 MPL 类型列表折叠到可变参数容器中
- 如何提升::融合::for_each添加类型以创建类型的 mpl::vector
- 漂亮的打印提升::MPL::字符串<...> GDB 中的类型
- 如何检查类型是否为mpl::apply-able
- 为什么boost mpl集允许非唯一类型
- 提升MPL和_类型
- 如何实例化和访问boost mpl类型
- 使用mpl::if_和integer模板参数选择类型
- Boost::mpl类型列表函数应用程序
- 提振.变体,提振.MPL:如何追加类型
- c++:提振.等效于在类型向量中的第i个类型上调用函数的MPL
- 编译错误在 boost::mpl:::<T>标签::类型