如何将type和mpl::vector连接成一个新的vector
How to join type and mpl::vector into a new vector
我使用下面的构造来创建一个mpl向量,类型为:
struct Struct1{
typedef int type;
};
struct Struct2{
typedef float type;
};
template<typename T> struct TypeReader{
typedef typename T::type type;
};
int main()
{
typedef bm::vector<Struct1,Struct2> MPLVector;
typedef bm::transform<MPLVector, TypeReader<bm::_1>>::type TypeList;
static_assert(bm::equal<TypeList, bm::vector<int,float> >::value, "Is not same");
}
到目前为止,这是预期的工作。现在我要做的是下面的
struct Struct3{
typedef bm::vector<char,double> type;
};
typedef bm::vector<Struct1,Struct2,Struct3> MPLVector;
typedef bm::transform<MPLVector, TypeReader<bm::_1>>::type TypeList;
static_assert(bm::equal<TypeList, bm::vector<int,float,char,double> >::value, "Is not same");
这不起作用。那么我需要如何改变我的metfunction结构,它将与两者一起工作,只是一个类型定义和一个mpl::vector?
或者如果这是不可能的如果我改变所有类型的类型定义为mpl向量是否有可能做到这一点?
我认为这对于mpl::transform
是不可能的,因为它需要从源序列中的单个元素生成结果序列中的多个元素。然而,这可以用mpl::fold
来完成,以及mpl::is_sequence
的专门化:
// Default case
template < typename Seq, typename TWrapper, typename Enable = void >
struct Flatten_imp
: mpl::push_back< Seq, typename TWrapper::type >
{
};
// Sequence case
template < typename Seq, typename TWrapper >
struct Flatten_imp<
Seq,
TWrapper, typename
boost::enable_if<
mpl::is_sequence< typename
TWrapper::type
>
>::type
>
{
typedef mpl::joint_view<
Seq, typename
TWrapper::type
> type;
};
template < typename Seq >
struct Flatten
: mpl::fold< Seq, mpl::vector<>, Flatten_imp< mpl::_, mpl::_ > >
{}
int main()
{
typedef mpl::vector< Struct1, Struct2, Struct3 > MPLVector;
typedef Flatten< MPLVector >::type TypeList;
static_assert(
mpl::equal<
TypeList,
mpl::vector< int, float, char, double >
>::value, "Is not same");
}
如果你希望平整化是递归的,你可以在Flatten_impl
中调用Flatten
来平整化序列,然后再追加它;但是,要注意,这种递归只在序列包含包装器而不包含直接类型(例如
struct Struct3
{
typedef mpl::vector< mpl::identity< char >, mpl::identity< double > > type;
}
你必须专门TypeReader
的情况下,参数是一个序列(mpl向量,融合列表/向量/元组);
在这种情况下,结合 mpl::back_inserter
和 mpl::copy
的功能(从参数的Sequence复制到目标类型)
我现在没有时间来演示这个。关于如何专门化序列的概念的提示,您可以查看boost::enable_if
。然而,概念验证可以很容易地完成,只需专注于template <typename> mpl::vector
相关文章:
- 在c++中用vector填充一个简单的动态数组
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- 访问 std:vector 的类成员 std:vector 在一个类中与另一个 std:vector
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 从 std::vector 中选择一个元素,而不是给定元素
- 使用 glDrawElements 绘制一个 std::vector
- 为什么 vector 的方法调整大小会创建一个额外的对象?
- 当涉及到一个序列时,"vector[n].push_back()"总是O(1)吗?
- 创建一个 const std::vector ,其中包含另一个 const std::vector 和其他值
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 如何设置一个 std::vector 与另一个,其中两个是不同类的向量?
- 动态创建 std::vector 并将其传递给另一个函数的各种方法
- C++ 如何在 std::vector 中插入一个连续的间隔范围?
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 如何创建一个继承自 std::vector 的类
- 给出一个 std::vector 对另一个向量的内存的所有权?
- 具有另一个类对象的 std::vector 的类