我正在使用新的 Boost.TypeErasure 库制作一个简单的示例。我有一个简单的类层次结构(您的标准教科书 OO 示例):
class Employee {
public:
std::string name() { return name_; }
std::string name_;
};
class Developer : public Employee {
public:
explicit Developer(const std::string& name) : Employee{name} {}
double salary() { return 100; }
};
class Manager : public Employee {
public:
explicit Manager(const std::string& name) : Employee{name} {}
double salary() { return 200; }
};
我想把这些放到一个any
需要 和 的方法salary()
中name()
。因此,根据文档,我这样做了:
BOOST_TYPE_ERASURE_MEMBER((has_salary), salary, 0);
BOOST_TYPE_ERASURE_MEMBER((has_name), name, 0);
typedef any<mpl::vector<
copy_constructible<>, // why?
has_salary<double()>,
has_name<std::string()>
>
> SalariedPerson;
这让我可以:
SalariedPerson sp = Manager{"John Doe"};
cout << sp.name() << " has a salary of " << sp.salary() << endl;
我不明白为什么我需要copy_constructible<>
在那里。有了它,一切都按预期编译和运行。没有它,我会得到这个编译错误(指向 的构造sp
):
error: invalid static_cast from type ‘const boost::type_erasure::detail::vtable_storage<boost::type_erasure::detail::vtable_adapter<has_salary<double(), boost::type_erasure::_self>, double(boost::type_erasure::detail::storage&)>, boost::type_erasure::detail::vtable_adapter<has_name<std::basic_string<char, std::char_traits<char>, std::allocator<char> >(), boost::type_erasure::_self>, std::basic_string<char, std::char_traits<char>, std::allocator<char> >(boost::type_erasure::detail::storage&)> >* const’ to type ‘const boost::type_erasure::detail::vtable_entry<boost::type_erasure::destructible<boost::type_erasure::_self> >*’
为什么会出现错误,我没有尝试复制构造任何东西,并且示例似乎没有使用它。