C++ 使用MPL列表扩展boost变体

C++ 使用MPL列表扩展boost变体,c++,boost,metaprogramming,boost-mpl,C++,Boost,Metaprogramming,Boost Mpl,我试图为程序提供一种向库中的变量添加新对象的方法,但我遇到了一些神秘的错误 #包括 #包括 #包括 #包括 结构内部类型1{}; 结构内部类型2{}; 模板 结构Foo { typedef boost::mpl::list< 内部类型1, 内部类型2 >类型; typename boost::生成变量< typename boost::mpl::联合视图< 类型, 本地类型 >::类型 >::输入容器名称; //typename boost::生成变量< //typename boost::mp

我试图为程序提供一种向库中的变量添加新对象的方法,但我遇到了一些神秘的错误

#包括
#包括
#包括
#包括
结构内部类型1{};
结构内部类型2{};
模板
结构Foo
{
typedef boost::mpl::list<
内部类型1,
内部类型2
>类型;
typename boost::生成变量<
typename boost::mpl::联合视图<
类型,
本地类型
>::类型
>::输入容器名称;
//typename boost::生成变量<
//typename boost::mpl::copy<
//本地类型,
//boost::mpl::back\u插入器
//>::类型
//>::输入容器;
};
结构LocalType1{};
结构LocalType2{};
int main()
{
typedef boost::mpl::list<
LocalType1,
本地类型2
>类型;
富富,;
}
通过使用
mpl::joint_view
(我认为这是实现此目的最有效的方法),我得到以下错误:

/usr/local/include/boost/mpl/clear.hpp:29:7: error: implicit instantiation of undefined template
通过使用
mpl::copy
取消对另一次尝试的注释,并将其替换为原始尝试,则错误会发生变化:

/usr/local/include/boost/mpl/aux_/push_back_impl.hpp:40:9: error: no matching function for call to 'assertion_failed'
有趣的是,它有:


这些错误对我来说都没有任何意义,因为第一,我看不出哪些模板不完整,第二,我没有使用哪些推回专业化?

问题是,
boost::mpl::clear
不是为
联合视图实现的。。。因此,巨大的编译器转储将以以下方式终止:

/usr/local/include/boost/mpl/clear.hpp:29:7: error: implicit instantiation of undefined template 'boost::mpl::clear_impl<boost::mpl::aux::joint_view_tag>::apply<boost::mpl::joint_view<boost::mpl::list<InternalType1, InternalType2, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::mpl::list<LocalType1, LocalType2, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> > >'
这样,您的代码就可以在gcc和clang上为我编译了

或者,如果您觉得在
名称空间boost::mpl
中添加内容有点可疑,但仍然希望坚持使用
列表,则可以使用:

typename boost::使变量覆盖<
typename boost::mpl::插入范围<
类型,
typename boost::mpl::end::type,
本地类型
>::类型
>::输入容器名称;

第二个很容易理解,不能与
推回一起使用
。您可以在
类型中使用
boost::mpl::front_inserter
或简单地使用
mpl::vector
。谢谢我将保留这个问题,因为联合视图解决方案可能是生产中最好的解决方案。除非您打算修改
make\u variant\u over
,否则我看不到更好的方法<代码>mpl::copy
from
mpl::vector
s是一种方法,如果你问meSo,这里的
联合视图是否不可行?它在文档中表示需要MPL序列。然后文档声明联合视图是一个正向序列。所以这两个应该是兼容的,不是吗?似乎就是这样,谢谢!我想,考虑到上下文,一个
mpl::copy
mpl::vector
听起来确实是最好的选择。正如您所说,空的
mpl::joint\u视图
实际上没有任何意义…@SamKellett实际上也可以将相同的
插入范围
元函数与
向量
一起使用。不管怎样,你最终都会得到同样的结果。
/usr/local/include/boost/mpl/clear.hpp:29:7: error: implicit instantiation of undefined template 'boost::mpl::clear_impl<boost::mpl::aux::joint_view_tag>::apply<boost::mpl::joint_view<boost::mpl::list<InternalType1, InternalType2, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::mpl::list<LocalType1, LocalType2, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> > >'
namespace boost { namespace mpl {
   template <>
   struct clear_impl<aux::joint_view_tag>
   {
       template <typename JV>
       struct apply {
           typedef list<> type; // since you're using list I figured
                                // I would too.
       };
   };
} }
typename boost::make_variant_over<
    typename boost::mpl::insert_range<
        Types,
        typename boost::mpl::end<Types>::type,
        LocalTypes
    >::type
>::type container_;