Использование copy_constructible в Boost.TypeErasure

Я делаю простой пример с использованием новой библиотеки 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> >*’

Почему ошибка, я не пытаюсь скопировать что-либо, и примеры, кажется, не используют это.

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]