您可以分享Boost::MPL使用情況(lambda數除外)的任何實際示例,只是爲了讓我更好地理解其用途和實際使用領域? MPL文檔教程有一個dimensional analysis的例子,但也許是因爲這是一個學術性的例子,它沒有給我一種Boost :: MPL的感覺,以及它何時可以被有效地使用。Boost :: MPL的實際用法示例?
回答
我已經使用Boost.Mpl生成變體類。
例如,給定一個MPL類型列表,諸如這樣的:
typedef boost::mpl::set<Foo, Bar, Baz> type_set;
然後我使用boost::mpl::fold
建立從每個其他派生類鏈,其中的每個類型添加類型之一的std::unordered_set
組。最終結果是一個包含unordered_set<Foo>
,unordered_set<Bar>
和unordered_set<Baz>
的類。
而且由於在boost::mpl::set
方面被指定的類,我可以遍歷這些類型的自動生成其它功能,諸如operator==
其比較所有unordered_set
S的。
我使用了一個更強化的尺寸分析庫Boost.Units。
我已經開發了編譯時反射庫中,然後使用該庫建立一個通用的類,它提供運行時反射到任何編譯時反射型中,我使用。通過支持自動生成的UI組件編輯這些反射類型的屬性。
這對我們的應用程序中事件的分佈也非常重要。例如,當某人更改他們希望系統所在的單位時,我不必教導該系統已將新項目添加到給定設備,因爲代碼使用MPL來分析這些類型,並且知道已添加了某些內容並改變它。
我只是用元編程技術Qt的信號包到的東西,恢復的類型安全通過他們的系統中刪除,並且能夠與任何功能實體連接。
不過說實話,你幾乎可以肯定,實際使用已經應用元編程技術時所使用的標準算法,如排序。排序算法的一個體面的實現使用一種較少進化的元編程形式來分析傳入的迭代器,然後使用標籤分派來啓動能夠充分利用這些迭代器的特徵的排序算法。
坦率地說,如果你不這樣做的元編程,然後你不使用C++的力量,你也可以被使用別的東西。
事實是,Boost.MPL,像Boost.Preprocessor,真正基石。
大部分的時間,你可能使用通過其他圖書館,一些Boost庫都在這兩個建造。
例如:
- Boost.Fusion(橫跨編譯時和運行時領域之間的間隙)
- Boost.MultiIndex的(對於一個更簡單的接口)
- 升壓。(對於三維分析)
- Boost.Variant可能,我想,也要看它
你可以用它unknowningly已經:)
爲了增加馬修的回答單元,它也使用相當廣泛整個Boost.Python和Luabind。
一些有趣的我所做的: https://github.com/edubois/static-factorial/blob/master/main.cpp
它使用的boost :: MPL的一小部分靜態計算的階乘< 8>()的值...
這可以幫助理解大意。
我在我的stat_log庫中廣泛使用boost :: mpl(和boost :: fusion)。該庫允許用戶指定統計和日誌記錄標籤及其相關行爲的層次結構,即每個標籤的統計類型(直方圖,計數器等)。
我在很大程度上依賴於元編程做正確的事與用戶所做的:
stat_log::writeStat<IP_PKTS_RCVD>(450);
例如,如果用戶定義類型特點:
template <>
struct stat_tag_to_type<IP_PKTS_RCVD>
{
using type = Accumulator<
stat_log::HistogramCount<
int,
1, //start bin
1500, //stop bin
10 //num_bits
>
>;
};
的「writeStat」撥打上面會代理(在編譯時)到直方圖統計量。這種設計技術的強大之處在於「writeStat」調用站點與所選的特定統計信息完全無關。
我還使用了豐富的MPL和boost :: fusion來實際查看統計信息。根據您的問題,請參見以下文件的boost :: MPL的最高濃度:
https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/stat_log_impl.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/tag_commander.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/stat_log.h
尤其是漂亮的模板元 「功能」 在stat_log_impl.h:
//This template is used in conjunction with an MPL algorithm
// with the same semantics as mpl::find_if.
//BoolFunc is the "condition" metafunction.
//StatTagFunc is a metafunction that transforms the given
// stat_tag into something the algorithm requires.
// For example the "Identity" metafunction would work here.
//StatTagArgs is extra arguments to the BoolFunc
template <template<typename...> class BoolFunc,
template<typename...> class StatTagFunc,
class... StatTagArgs>
struct tag_node_query
{
template<typename TheTagNode>
struct apply
{
using stat_tag = typename TheTagNode::tag;
using type = std::integral_constant
<
bool,
BoolFunc<
typename StatTagFunc<stat_tag>::type,
StatTagArgs...
>::value
>;
};
};
- 1. 使用boost :: mpl :: bitor_
- 2. Javascript關閉的實際用法/示例
- 3. C++ boost mpl vector
- 4. boost mpl count爲簡單例子
- 5. C++ Boost :: MPL fold示例 - 錯誤的參數個數
- 6. Vim,實際使用示例
- 7. 如何實例化並訪問boost mpl類型?
- 8. 有沒有辦法打破boost :: mpl for_each?
- 9. 「ref」使用的實際示例
- 10. JMX或NetMX實際示例
- 11. boost-mpl比較迭代器
- 12. Boost MPL佔位符和Lambda
- 13. boost mpl積分型積累
- 14. Cast boost ::將任何實例轉換爲其實際類型
- 15. 如何使用boost :: mpl編寫策略?
- 16. 使用boost mpl lambda與variadic模板類
- 17. BufferManager的實際用例
- 18. 如何將mpl :: transform應用到mpl :: string?
- 19. 實際示例中的內存泄漏
- 20. 我需要exp()函數的boost :: mpl實現
- 21. 如何使用boost :: mpl :: fold和boost :: fusion :: map?
- 22. Boost Asio示例 - 奇怪的C++語法
- 23. 如何通過boost :: mpl :: list循環?
- 24. 從boost mpl載體註冊類型
- 25. Boost :: Spirit簡單文法示例
- 26. 用於C90代碼分析的Rascal-MPL示例
- 27. Dispatcher.DisableProcessing的實際用法?
- 28. Powershell:$ ^和$$的實際用法?
- 29. MethodRental Class的實際用法?
- 30. 任何使用boost MPL或類似的迭代器過濾器的方法
我認爲這個問題是關於Boost.MPL,而不是一般的元編程。 – jalf 2011-01-09 13:33:05
如果沒有所有導致它的東西,你都不能談論MPL。 – 2011-01-09 22:30:06
但你可以問「你使用Boost.MPL」而不問「你使用任何其他模板元編程的例子」,就像你可以問「你駕駛沃爾沃」一樣,而不問「你開車嗎? 「 – jalf 2011-04-26 09:58:34