在 C++11 中,如何為匿名的結構體添加構造函數?
struct _{
_() {
cout &<&< "anonymous constructor called." &<&< endl; } } __;請問如何將 「_」 聲明為匿名結構體?如果只是簡單地將 "_" 刪去的話在構造函數的括弧處會報錯。
顯然沒有名字的類是沒法顯式寫構造的,但是我們有C++11的non-static member in-class initialization,通常情況下你可以直接寫
struct
{
int count = 0;
bool done = false;
} abc;
在用得到匿名類的通常場景下(純數據,臨時數據結構)這也足夠了。
那麼如果樓主堅持一定要在構造里做點不可告人的事情怎麼辦?
根據C++ RAII的精神,構造和析構是對成員遞歸的。
我們可以構造一個成員來幫忙執行一段函數:
struct AutoExec
{
template&
AutoExec(Callable callable)
{
callable();
}
};
struct
{
AutoExec wtf{[]{
std::cout &<&< "anonymous constructor called.
";
}};
} abc;
其中AutoExec類的唯一用途就是把任意函數(或functor,lambda)通過模板構造函數執行掉,於是就可以再結合成員初始化來代替匿名類的構造了。
#include &
int main(){
struct {
void *p_this;
int i = [this](){
p_this = this;
return 0;
}();
} foo;
std::cout &<&< foo &<&<
&<&< foo.p_this &<&< std::endl;
return 0;
}
可以用捕獲 this 的藍陀表達式再帶上 () ,替換最後一個非靜態成員的默認初始化器。
但其他特殊成員函數似乎沒法手動定製……
推薦閱讀:
※《自頂向下方法》筆記 · 編程作業2 · UDPping程序
※Spotify 如何對歌曲隨機播放?
※帶你入門Spark(資源整理)
※自己寫的編譯器一般幾個符號表比較合適?
※句柄是什麼?