如何创建一个取决于元组类型名称的boost元组?

时间:2011-01-12 01:28:35

标签: c++ boost metaprogramming

我想创建一个类型的元组,它取决于该类型的名称。

也许例子会澄清我的问题:

//T would be boost::tuples::tuple<int, int, ...>
template <typename T>
T generate()
{
    typedef T GT;
    typedef boost::tuples::element<0,GT>::type tt0;
    typedef boost::tuples::element<1,GT>::type tt1;
    typedef boost::tuples::element<2,GT>::type tt2;
    if(tt3==null_type)
        return boost::tuples::make_tuple<tt0,tt1>(static_cast<tt0>(1), static_cast<tt1>(2));
    else
        return boost::tuples::make_tuple<tt0, tt1, tt2>(static_cast<tt0>(1), static_cast<tt1>(2), ...);
}

编辑: 我找到了很好的方法,模板递归。 问题解决了。

1 个答案:

答案 0 :(得分:2)

typedef typename oost::tuples::element<0,GT>::type tt0;

...

if(tt3==null_type) 

您无法检查类型,请使用mpl::if_代替

        return boost::tuples::make_tuple<tt0,tt1>(static_cast<tt0>(1), static_cast<tt1>(2));
    else
        return boost::tuples::make_tuple<tt0, tt1, tt2>(static_cast<tt0>(1), static_cast<tt1>(2), ...);
你试图删除null_type吗?只需使用boost::fusion::remove

这是另一种解决方案:

template <typename T>
tuple<tt0,tt1> 
generate(typename enable_if<is_same<tt3, null_type> >::type* = 0) {
    typedef typename boost::tuples::element<0,T>::type tt0;
    typedef typename boost::tuples::element<1,T>::type tt1;
     return make_tuple(tt0(1), tt1(1));
}

与其他案件类似。

通知:boost::enable_ifboost::is_same