2017-06-07 43 views
-1

據我所知,有一些在默認情況下傳播到各個領域成員的一些特殊功能。 : -
拷貝賦值,拷貝構造函數,賦值移動,移動的構造函數,析構函數等效仿的是傳播到像運營商各個領域的功能=和析構

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

回答

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應用於其每個成員」。

除非你做這個數十次在各種情況下,它不會是值得的。

總之,沒有,真的沒有。但也許有很多工作需要處理。