模拟一个传播到每个字段的函数,如operator =和destructor

时间:2017-06-07 02:12:35

标签: c++ templates c++14 raii

据我了解,默认情况下会有一些特殊函数传播到每个字段成员。 : -
复制赋值,复制构造函数,移动赋值,移动构造函数,析构函数等。

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有用。

1 个答案:

答案 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应用于每个成员”。

除非你在各种情况下必须这么做几十次,否则不值得。

简而言之,不,不是真的。但也许有很多工作。