如果你正在跟蹤我的問題歷史,我正在更新一個維度分析庫,以便放棄宏的惡夢並學習C++ 11,可變參數模板,元編程和函數式編程範例。對我而言,這些東西仍然很神奇。試圖總結兩個編譯時間元組整數序列
無論如何,我有定義物理單位的指數常量的元組。
template<int... I>
using make_dimension = std::tuple<std::ratio<I>...>;
using scalar_dimension = make_dimension<0, 0, 0, 0, 0, 0, 0>;
using length_dimension = make_dimension<1, 0, 0, 0, 0, 0, 0>;
using time_dimension = make_dimension<0, 0, 1, 0, 0, 0, 0>;
這是模擬SI單元的庫的(部分)。你只能乘以不同的單位,你可以額外添加像單位和標量。這些庫很簡單,因爲如果你不適當地混合單元,它們會導致編譯時錯誤。有400多個單位,其中大部分是以其他單位來定義的。當乘以單位時,指數被加上,當除法單位時,指數被減去。因此,要確定速度,我很想表達的手段:
using velocity_dimension = divide_dimensions<length_dimension, time_dimension>;
,並應在功能上等同於書寫:
using velocity_dimension = make_dimension<1, 0, -1, 0, 0, 0, 0>;
我一直在谷歌搜索,但我不知道術語來着陸一些命中。我發現的最接近的是一個for_each,它在運行時將一個函數應用於一個元組的元素......這有點讓我頭腦發熱,所以我無法弄清楚如何將它變成編譯時迭代元素。上面的「make_dimension」剛剛向我解釋,它讓我大惑不解,但我恢復了。我有點煩心地要求發放講義,所以沒有人有足夠的資源來學習這些東西嗎?我很難相信我是唯一一個對此感興趣的人。
你已經採取了看看['boost.units'庫(HTTP://www.boost。組織/ DOC /庫/ 1_56_0/DOC/HTML/boost_units.html)? – dyp 2014-10-09 00:48:59
*「你只能乘以不同的單位」*所以,沒有平方米,沒有m /s²等?爲什麼? – dyp 2014-10-09 00:50:14
下面是一對元組變換的簡單示例:http://coliru.stacked-crooked.com/a/e5f03a72538ce8c5由於這是類型列表的基本功能,因此您可以在許多TMP庫中找到一些實現。我在我的例子中使用的接口非常尷尬(但它與'std :: ratio_add'很好地集成在一起);我建議你嘗試使用'constexpr'函數。 – dyp 2014-10-09 01:04:39