在 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(資源整理)
自己寫的編譯器一般幾個符號表比較合適?
句柄是什麼?

TAG:編程 | C | CC | C11 | C程序設計 |