Sam*_*ett 6 c++ boost metaprogramming boost-mpl
我正在尝试为程序提供一种向库中的变体添加新对象的方法,但我遇到了一些神秘的错误.
#include <boost/mpl/copy.hpp>
#include <boost/mpl/joint_view.hpp>
#include <boost/mpl/list.hpp>
#include <boost/variant/variant.hpp>
struct InternalType1 {};
struct InternalType2 {};
template <typename LocalTypes>
struct Foo
{
typedef boost::mpl::list<
InternalType1,
InternalType2
> Types;
typename boost::make_variant_over<
typename boost::mpl::joint_view<
Types,
LocalTypes
>::type
>::type container_;
// typename boost::make_variant_over<
// typename boost::mpl::copy<
// LocalTypes,
// boost::mpl::back_inserter<Types>
// >::type
// >::type container_;
};
struct LocalType1 {};
struct LocalType2 {};
int main()
{
typedef boost::mpl::list<
LocalType1,
LocalType2
> Types;
Foo<Types> foo;
}
Run Code Online (Sandbox Code Playgroud)
通过使用mpl::joint_view(我假设是否是实现此目的的最有效方法),我得到以下错误:
/usr/local/include/boost/mpl/clear.hpp:29:7: error: implicit instantiation of undefined template
Run Code Online (Sandbox Code Playgroud)
通过取消注释其他尝试,使用mpl::copy和替换原始,然后错误更改:
/usr/local/include/boost/mpl/aux_/push_back_impl.hpp:40:9: error: no matching function for call to 'assertion_failed'
Run Code Online (Sandbox Code Playgroud)
有趣的是,它有以下评论:
// should be instantiated only in the context of 'has_push_back_impl';
// if you've got an assert here, you are requesting a 'push_back'
// specialization that doesn't exist.
Run Code Online (Sandbox Code Playgroud)
这些错误都没有对我有任何意义,因为w/r/t第一个,我没有看到哪些模板不完整,而第二个,我没有使用哪个push_back特化?
问题是boost::mpl::clear<>没有实现joint_view...因此巨大的编译器转储终止于:
/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> > >'
Run Code Online (Sandbox Code Playgroud)
(我不知道如何正确格式化)
这可能只是库中的疏忽,或者可能只是不清楚在这种情况下应该返回哪个空序列类型。如果你想使用 a joint_view,你必须提供clear_impl某个地方的专业化:
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.
};
};
} }
Run Code Online (Sandbox Code Playgroud)
这样,您的代码就可以在 gcc 和 clang 上为我编译。
或者,如果添加东西让namespace boost::mpl你觉得有点可疑,但你仍然想坚持使用lists,你可以使用insert_range:
typename boost::make_variant_over<
typename boost::mpl::insert_range<
Types,
typename boost::mpl::end<Types>::type,
LocalTypes
>::type
>::type container_;
Run Code Online (Sandbox Code Playgroud)