是否可以融合适应基础class?
Is it possible to fusion adapt the base class?
是否可以融合适应基础 class 就好像它是成员一样?
首先这是文档示例,与新案例并列:
#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) 我必须让所有成员 getter 和 setter 函数 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))
)
好吧,看起来(通过实验)可以在 BOOST_FUSION_ADAPT_ADT
中放入各种有效的表达式。我不太确定这是否是最优的(例如,如果融合会在访问元素时制作副本),因此欢迎其他答案。
#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)
)
是否可以融合适应基础 class 就好像它是成员一样?
首先这是文档示例,与新案例并列:
#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) 我必须让所有成员 getter 和 setter 函数 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))
)
好吧,看起来(通过实验)可以在 BOOST_FUSION_ADAPT_ADT
中放入各种有效的表达式。我不太确定这是否是最优的(例如,如果融合会在访问元素时制作副本),因此欢迎其他答案。
#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)
)