2016-09-22 6 views
6

Можно ли адаптировать базовый класс к слиянию, как если бы он был членом?Возможно ли слияние адаптировать базовый класс?

Сначала это пример документации, бок о бок с новым делом:

#include <boost/fusion/adapted/struct/adapt_struct.hpp> 
#include <boost/fusion/include/adapt_struct.hpp> 

struct employee{ 
    std::string name; 
    int age; 
}; 

BOOST_FUSION_ADAPT_STRUCT(
    employee, 
    (std::string, name) 
    (int, age)) 

struct employee2 : std::string{ 
    int age; 
}; 

BOOST_FUSION_ADAPT_STRUCT(
    employee2, 
    (std::string, name) ??? 
    (int, age)) 


int main(){} 

Что я должен поставить в соответствие с ???.

В настоящее время единственным решением, которое я нашел, является выполнение этого, но 1) Я должен сделать все функции для членов-получателей и сеттеров 2) кажется излишним.

#include <boost/fusion/adapted/adt/adapt_adt.hpp> 
struct employee2 : std::string{ 
    int age; 
    void set_base(std::string const& age_){std::string::operator=(age_);} 
    std::string const& get_base() const{return static_cast<std::string const&>(*this);} 
    void set_age(int const& age_){age = age_;} 
    int const& get_age() const{return age;} 
}; 

BOOST_FUSION_ADAPT_ADT(
    employee2, 
    (std::string, std::string, obj.get_base(), obj.set_base(val)) 
    (int, int, obj.get_age(), obj.set_age(val)) 
) 

ответ

0

Ну, это выглядит (экспериментально), что можно поставить все виды допустимых выражений в BOOST_FUSION_ADAPT_ADT. Я не очень уверен, что это оптимально (например, если fusion будет делать копии при доступе к элементам), поэтому другие ответы приветствуются.

#include <boost/fusion/adapted/adt/adapt_adt.hpp> 
BOOST_FUSION_ADAPT_ADT(
    employee2, 
    (static_cast<std::string const&>(obj), obj.std::string::operator=(val)) 
    (obj.age, obj.age = val) 
) 

int main(){ 

    employee2 e2; 
    boost::fusion::at_c<0>(e2) = "Pepe"; 
    boost::fusion::at_c<1>(e2) = 37; 

    cout << e2 << " " << e2.age <<'\n'; 

} 

Это может предотвратить некоторые копии и, кажется, работает в более случаях (например boost::fusion::copy), но я не знаю, почему:

BOOST_FUSION_ADAPT_ADT(
    employee2, 
    (std::string, std::string const&, obj, obj.std::string::operator=(val)) 
    (int, int const&, obj.age, obj.age = val) 
)