2012-08-14 87 views
0

我是boost :: mpl和TMP的新成员。我想建立一个类如下 -从boost :: mpl:vector typelist定义成员变量

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; 
    }; 

    //I want to implement this function 
    template< size_t D > 
    typename Dim<D>::Type GetElement() 
    { 
     if(D == 0) 
     { 
      return element1_; 
     } 
     if(D == 1) 
     { 
      return element2_; 
     } 
     .... 
    } 

private: 
    typename Dim<0>::Type element1_; 
    typename Dim<1>::Type element2_; 
    .... 
}; 

,我打算如下使用这个类 -

typedef Demo< boost::mpl::vector< int, float, long > > D1; 
D1 d; 
D1::Dim<0>::Type i = d.GetElement<0>(); 

我很好奇,想知道如果有相当声明这些元素没有更好的方法而不是硬编码并重复它们的声明(和返回) - 某些(可能)像一个具有异构类型和更简单的元素访问的数组。

注意: - 此代码可能有编译器错误(我没有测试它),但我希望它传达我的问题。

+1

你想要的是,事实上,一个'tuple',无论是从升压或C++ 11标准。你可能手动做的每件事都只是重新实现。 – Xeo 2012-08-14 11:38:38

回答

0

你应该找到一种方法从你的类型列表中创建一个元组。 这里有一篇文章似乎描述了如何用C++ 11 featuers完成这项工作。 http://www.devx.com/cplus/Article/41533/1954 Stephen Lavavej在“Going Native 2012”上也有一个talk

+0

虽然这并没有提供完整的答案,但它引导我进入了Boost.Fusion。看到我的答案下面的工作解决方案。 – user1588625 2012-08-14 23:46:47

0

我结束了使用boost ::融合::向量如下 -

#include <iostream> 
#include <tuple> 
#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_; 
};