我正在学习boost :: mpl,我有以下课程 -
#include <string>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/at.hpp>
#include <boost/fusion/include/mpl.hpp>
#include <boost/fusion/container.hpp>
using namespace boost;
using namespace std;
template< typename T >
class Demo
{
public:
typedef boost::mpl::size<T> NumDimensions;
template< size_t D >
struct Dim
{
typedef typename boost::mpl::at_c< T, D >::type Type;
};
template< size_t D >
typename Dim<D>::Type& GetElement()
{
return fusion::at_c<D>(elements_);
}
private:
typename fusion::result_of::as_vector< T >::type elements_;
};
只要我使用带有默认构造函数(或默认类型)的类型
,这样就可以了int main(int argc, char *argv[])
{
typedef Demo< boost::mpl::vector< int, std::string > > D1;
D1 d;
D1::Dim<0>::Type &i = d.GetElement<0>();
i = "Hello World!";
cout << " " << i << endl;
}
但是,如果我使用没有默认构造函数的类型,则会抛出编译器错误,因为向量初始化失败。是否有一种标准方法可以正确地初始化成员(在构造函数中)而不需要使用指针/引用?
答案 0 :(得分:1)
您可以使用fusion::vector
的构造函数:
#include <string>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/at.hpp>
#include <boost/fusion/include/mpl.hpp>
#include <boost/fusion/container/vector.hpp>
#include <utility>
struct foo {
explicit foo(int){}
};
template< typename T >
class Demo
{
public:
//You don't need to use variadic templates and perfect forwarding
//but you may need to emulate them to get this effect (depending on
//where exactly you need to construct Demo).
//Another alternative would be to pass in a fusion::vector, and
//copy construct `elements` with that vector.
template<typename ...Args>
Demo(Args&& ...args) : elements_(std::forward<Args>(args)...) {}
typedef boost::mpl::size<T> NumDimensions;
template< size_t D >
struct Dim
{
typedef typename boost::mpl::at_c< T, D >::type Type;
};
template< size_t D >
typename Dim<D>::Type& GetElement()
{
return boost::fusion::at_c<D>(elements_);
}
private:
typename boost::fusion::result_of::as_vector< T >::type elements_;
};
int main() {
Demo<boost::mpl::vector< foo, std::string > > a(foo(10),"hi");
}