Я делаю простой пример с использованием новой библиотеки Boost.TypeErasure. У меня есть простая иерархия классов (ваш стандартный пример из учебника):
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> >*’
Почему ошибка, я не пытаюсь скопировать что-либо, и примеры, кажется, не используют это.
Задача ещё не решена.
Других решений пока нет …