据我了解,默认情况下会有一些特殊函数传播到每个字段成员。 : -
复制赋值,复制构造函数,移动赋值,移动构造函数,析构函数等。
class B{};
class C{B b;};
C c1; C c2;
c1=c2; //<-- automatic invoke B::operator=()
是否有可能部署一些C ++技巧来创建/模拟具有如此酷炫功能的自定义功能?
如果不是,这是一个完整的答案 如果是,请显示演示;我相信它应该是一个免费的功能,例如: -
class A{};
class B{};
void f(A a){}
class C{public: A a;B b;};
//no need to code "void f(C c){f(c.a);}"
C c1;
f(c1); //<-- automatic invoke f(c1.a), but not invoke f(c1.b)
模板功能和 SFINAE 可能会有用,但在这种情况下我不知道如何申请。
我认为这可能对一些更先进的RAII有用。
答案 0 :(得分:2)
写as_tie
:
struct C{
A a;
B b;
friend auto as_tie(C& c){
return std::tie(c.a, c.b);
}
};
你需要以这种方式为你想要与之交互的每种类型写这个;在编译时反射到达C ++之前,没有办法避免这种情况。但是,as_tie
可以轻松实现==
,swap
之类的内容,因此您可以获得奖金。
之后,foreach-tuple-element,override set objects,y-combinators和invoke-if-possible的混合使你能够说“递归地将f
应用于每个成员”。
除非你在各种情况下必须这么做几十次,否则不值得。
简而言之,不,不是真的。但也许有很多工作。