最近,我尝试将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;类型*。
问题:
是否可以使上面的代码有效?
答案 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;
}