有没有办法恢复boost mpl引用中嵌入的原始模板模板类?

时间:2014-07-21 01:19:36

标签: c++ templates c++11 boost boost-mpl

我引用了一个模板类,将它放入一个mpl :: vector中:

boost::mpl::vector<int, boost::mpl::quote2<std::pair>>

然后,我得到了第二个元素:

using A=typename boost::mpl::at<T, boost::mpl::int_<2>>::type;

我现在需要将原始模板类传递给类似这样的类:

template<class A, template<class, class> class C>
class B{
    C<A, B*> _c;
};

我尝试使用apply或bind,但找不到让B接受第二个参数的方法。

我得到了那种错误:

error: template argument for template template parameter must be a class template or type alias template

编辑:

示例代码:

#include <boost/mpl/vector.hpp>
#include <boost/mpl/quote.hpp>
#include <boost/mpl/at.hpp>

template<class, class> class A{};
template<class A, template<class, class> class C>
class B{
    C<A, B*> _c;
};
using T=boost::mpl::vector<int, boost::mpl::quote2<A>> ;
using T1=typename boost::mpl::at<T, boost::mpl::int_<0>>::type;
using T2=typename boost::mpl::at<T, boost::mpl::int_<1>>::type;

int main(){
    B<T1, T2> b;
    return 0;
}

我明白了:

error: template argument for template template parameter must be a class template or type alias template B<T1, T2> b;

1 个答案:

答案 0 :(得分:2)

MPL仍然主要是C ++ 03 lib AFAIK,你试图让它在C ++ 11之前生成一些在概念上不存在的东西。我怀疑在这种情况下让quote工作是语法的巧合,而不是预期的功能。

以下代码在VC2013中成功编译:

#include <boost/mpl/vector.hpp>
#include <boost/mpl/quote.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/mpl/at.hpp>

template<class, class> class A{};
template<class A, template<class, class> class C>
class B{
    C<A, B*> _c;
};
using T = boost::mpl::vector < int, boost::mpl::quote2<A> > ;
using T1 = boost::mpl::at<T, boost::mpl::int_<0>>::type;
using T2 = boost::mpl::at<T, boost::mpl::int_<1>>::type;

template<typename X1, typename X2>
using TT2 = typename boost::mpl::apply<T2, X1, X2>::type;

int main(int argc, char* argv[])
{
    B<T1, TT2> b;
    return 0;
}