2016-09-22 21 views
6

Baz sınıfını, bir üyenin nerede olduğu gibi eritmek mümkün mü?Temel sınıfı füzyona uyarlamak mümkün mü?

Öncelikle bu belge örneği, yan-yana yeni vaka ile: Ben ??? doğrultusunda neleri içermelidir

#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(){} 

.

Şu anda bulduğum tek çözüm bunu yapmaktır, ancak 1) Tüm üyelerin getter ve ayarlayıcı işlevleri yapması gerekiyor 2) bir overkill gibi görünüyor.

#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)) 
) 

cevap

0

Eh, bir BOOST_FUSION_ADAPT_ADT geçerli ifadelerin her türlü koyabilirsiniz ki (deneylerle) görünüyor. Bunun uygun olup olmadığından emin değilim (örneğin füzyon elemanlara erişirken kopyalar çıkarsa), diğer cevaplar karşılanır.

#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'; 

} 

Bu, bazı kopyaları önlemek ve (örneğin boost::fusion::copy) daha durumlarda iş gibi görünüyor ama emin değilim neden:

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