具有前向声明类型的Boost.TypeErasure

时间:2015-09-01 12:49:21

标签: c++ boost boost-type-erasure

最近,我尝试将boost.type_erasure与前向声明类型一起使用,如下所示:

#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/member.hpp>

struct Type;

BOOST_TYPE_ERASURE_MEMBER((HasTest), Test, 1)

using Any = boost::type_erasure::any <
    boost::mpl::vector <
    HasTest<void(Type&)>,
    boost::type_erasure::destructible<>,
    boost::type_erasure::relaxed
    >
>;

int main() {
    Any obj;
}

但是,编译器(例如clang)抱怨类型不完整:

/usr/local/include/boost/type_traits/is_base_and_derived.hpp:228:42: error: incomplete type 'Type' used in type trait expression

    BOOST_STATIC_CONSTANT(bool, value = (BOOST_IS_BASE_OF(B,D) && ! ::boost::is_same<ncvB,ncvD>::value));

最后,我必须通过将API从引用更改为指针来解决,即替换Type&amp;类型*。

问题:

是否可以使上面的代码有效?

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误。首先,宏BOOST_TYPE_ERASURE_MEMBER接受成员函数所采用的参数数量的参数。所以你想要:

BOOST_TYPE_ERASURE_MEMBER((HasTest), Test, 1)

接下来,any模仿Concept,可以是概念列表。你忘记了列表部分,所以你需要:

using Any = any<boost::mpl::vector<
    HasTest<void(Type&)>,
    relaxed
    >>;

否则,relaxed未包含在Concept中 - 这允许默认构造。接下来,您在any中不允许销毁,因此您在~any()上遇到编译错误。您还需要提供destructible<>

最后,您可以使用前向声明的类型定义Any。它必须完全按照你使用它的类型。以下编译:

#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/member.hpp>

namespace mpl = boost::mpl;
using namespace boost::type_erasure;

struct Type;

BOOST_TYPE_ERASURE_MEMBER((HasTest), Test, 1)

using Any = any<mpl::vector<
    HasTest<void(Type&)>,
    relaxed,
    destructible<>
>>;

struct Type { };

int main() { 
    Any obj;
}