2008-10-26 46 views
13

這個問題的存在是因爲它具有 歷史意義,但它不是 考慮好,切合主題的問題 這個網站,所以請不要使用它 作爲證據,你可以在這裏問類似 問題。您在C++中看到的元編程最酷的例子是什麼?

更多信息:https://stackoverflow.com/faq


什麼是你在C++中看到元編程的最酷的例子嗎?
您在C++中看到的元編程有什麼實際用途?

+0

我認爲Boost Metaparse是一個了不起的東西https://github.com/boostorg/metaparse https://github.com/sabel83/metaparse_tutorial – 2016-10-11 22:31:40

回答

23

個人而言,我認爲Boost.Spirit是一個非常神奇的元編程的例子。它是一個完整的解析器生成器,可讓您使用C++語法表達語法。

+1

+1:精神病很重。你可能想鏈接到更新版本的精神?這個版本看起來有點舊了。 – n1ckp 2010-10-27 01:19:38

+0

@ n1ck:謝謝,我更新的鏈接 – Ferruccio 2010-10-27 05:56:36

7

最酷的元編程示例:欺騙編譯器計算素數列表。不太實際,但令人印象深刻。

一個實際用途是編譯時聲明語句,即如果布爾條件不成立,則會導致編譯錯誤。

+0

+1對於靜態斷言 – 2011-02-10 10:17:41

2

luabind是一個很酷的實際例子,用於綁定C++類相當不錯的綁定DSL到Lua

19

元編程的最實際應用正在轉向一個運行時錯誤成一個編譯時錯誤。

示例:讓我們調用接口IFoo。我的一個程序處理了一個COM對象,它有多條IFoo路徑(非常複雜的繼承層次結構)。不幸的是,底層的COM對象實現並沒有意識到他們有多條IFoo路徑。他們認爲它總是最左邊的一個。因此,他們的代碼內,下面的模式是很常見的

void SomeMethod(IFoo* pFoo) { 
     CFooImpl *p = (CFooImpl)pFoo; 
    } 

第二的IFoo雖然引起所產生的「p」的指針是完全無效(多重繼承是危險的)。

長期的解決方案是讓COM對象所有者解決這個問題。短期來說,儘管我需要確保我總是返回正確的IFoo。我可以通過使用QI來保證我擁有合適的IFoo,並避免向IFoo隱含的投射。所以我創建了一個新的CComPtr實現,並在等方法中添加了下面的覆蓋。

template <typename T> 
CComPtr<T>& operator=(const T* pT) { 
// CComPTr Assign logic 
} 
template <> 
CComPtr<IFoo> operator=<IFoo>(const IFoo* pT) { 
    COMPILE_ERROR(); 
} 

這很快揭示了我隱含地投向IFoo的每一個地方。

+1

QI =的QueryInterface http://msdn.microsoft.com/en-us/library/ms682521(VS.85).aspx – JaredPar 2008-10-26 09:42:00

+2

這是元編程?看起來像一個簡單的專業化。 – fizzer 2008-10-26 09:44:44

12

Blitz++使用模板做了一些令人印象深刻的事情(例如,單一可讀代碼行可以轉化爲多維數組上的一組循環,並自動進行優化以實現最佳遍歷順序)。

4

我不得不說Boost.Lambda來自Boost.Function和Boost.Bind,他們所有的無縫協同工作的方式。他們提供了一個非常漂亮的界面,並就儘可能容易在未真正建立了它的語言功能的編程。

0

我不久前提出了一個問題:C++ Runtime Knowledge of Classes和我從StackOverflow用戶得到的答案「Denice」是一個網址Meatspace: C++ runtime class registration

我認爲這是一種非常酷的方式來使用模板和實例化所有派生自基類的對象,這樣當我有10個C++文件時,它們都可以在底部添加AUTO_REGISTER_BASE(),並且當一切都全部完成和鏈接,只有那些類/文件,使得它會被註冊,所以在運行時,你可以在不同的類可用之間切換,而那些不可用沒有註冊,因此不能被意外調用。 (),kqueue(),/ dev/epoll,Solaris有它自己的事情,poll()),並且我需要一種方法來獲得所有的事件通知類文件存在於目錄中,但取決於運行Makefile的操作系統,它只會編譯某些文件。我需要一種方法來知道在運行時哪些是可用的,並且對使用的庫來選擇自己喜好的程序員的一種方式,但是如果它是不可用的,只是使用做出最符合邏輯意義上的平臺之一(他們每個有權分配給他們)。

上面的代碼幫我實現這個目標,有一些大幅的修改,但它幫助我無 - 少!

12

未實際使用的(除非是編譯器測試),但metatrace是懷特迪風格(即遞歸編寫和確定性)光線跟蹤器,其產生像那些在編譯時的圖像:

metatrace example

一些更復雜的部分of the code可以在fixp.hh中看到,其中使用Heron方法實現了定點sqrt,或者顯示了射線/球面交點計算的sphere.hh

相關問題