3

我正在使用新的 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> >*’

为什么会出现错误,我没有尝试复制构造任何东西,并且示例似乎没有使用它。

4

0 回答 0