增强MPL转换序列"真实"类型
Boost mpl transformed sequence "real" type
请参阅boost mpl转换文档中的以下代码:
typedef vector<char,short,int,long,float,double> types;
typedef vector<char*,short*,int*,long*,float*,double*> pointers;
typedef transform< types,boost::add_pointer<_1> >::type result;
BOOST_STATIC_ASSERT(( equal<result,pointers>::value ));
我想了解boost::mpl
的类型系统以及"它实际上是如何工作的"。据我所知,mpl::equal
只是比较以下两个序列的元素,而不是整个序列类型本身。我不明白为什么以下失败:
BOOST_STATIC_ASSERT(( std::is_same<result,pointers>::value )); //< assert fails
为什么结果类型与"指针"类型不是100%相同?我想这是因为mpl在懒惰地执行转换,还是结果只是一个序列,不再是矢量?有没有可能以某种方式迫使mpl不再懒惰,并获得100%相同的类型(我可以用这个结果自己写一个转换函数,但我想知道如何在mpl中做到这一点)?
我已经尝试了一些事情,比如将结果插入一个新的向量中,但没有成功:
BOOST_STATIC_ASSERT(( std::is_same<
mpl::insert_range< mpl::vector<>, mpl::begin<mpl::vector<> >::type,
result >::type, pointers >::value )); //< assert fails too
此外,我尝试在转换函数中使用back_insert,但也失败了:
typedef transform< types,boost::add_pointer<_1>,
mpl::back_inserter< mpl::vector< > > >::type result_new;
BOOST_STATIC_ASSERT(( std::is_same<result_new,pointers>::value )); //< fails...
阅读"文档"对我没有帮助。那么,有可能用mpl变换(或任何其他变换序列函数)得到100%相同的类型吗?类型的结果是什么
result
"在现实中",当它不与指针相同时?
再次感谢@llonesmiz使用typeid()漂亮地打印类型的代码,这有助于理解发生了什么。
因此,真正的结果类型似乎取决于编译器(可能是boost#ifdefs),英特尔编译器和visual studio将其转换回std::vectorN<>其中最大N是升压中的预定义数字(因此当N太大时它不起作用)。对于g++,生成了一个损坏的类型(甚至是我的转换调用中的两个不同类型)。
所以我想通过mpl::equal检查类型是可以的(检查范围的元素)。如果所有类型都应该"真正"等效(std::is_same成立),我想您需要手动将结果转换为一个可变模板类std::tuple。
请参阅http://liveworkspace.org/code/3l8O9K$16代码样本
简而言之:
template < class T, class R >
struct ToStdTuple;
template < class... TTypes, class X >
struct ToStdTuple< std::tuple< TTypes... >, X >
{
typedef std::tuple< TTypes..., X > type;
};
然后
// typedef mpl::vector<char,short,int,long,float,double> types;
// typedef mpl::transform< types,boost::add_pointer<mpl::_1> >::type result;
typedef mpl::fold< result, std::tuple<>,
ToStdTuple< mpl::_1, mpl::_2 > >::type result_normalized;
导致
std::tuple<char*, short*, int*, long*, float*, double*>
对于所有转换调用
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 激励'inline'说明符的真实世界示例?
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 我可以使用 decltype() 或其他东西通过指针获取真实类型吗?
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- STD :: SETW,STD :: SETFILL等的真实返回类型是什么?
- Qt nmake:错误 C3203:"map":非专用类模板不能用作模板参数"base"的模板参数,预期为真实类型
- 究竟为什么编译器在运行时之前无法确定变量的真实类型?
- 增强MPL转换序列"真实"类型