2016-07-26 111 views
1

boost::hana的新功能,嘗試一個簡單的實驗來找到一組類型中的一個類型,然後打印它的typeid.name。不過我正在static_assert錯誤(注:Xcode中7.2.1)Boost hana find set in set

這是代碼:

auto set = hana::make_set(hana::type_c<int>, hana::type_c<float>); 

auto s = hana::adjust(set, hana::type_c<int>, [](auto x){ std::cout << typeid(x).name() << std::endl; }); 

的錯誤是:

「花::調整(XS,價值, f)要求'xs'是一個Functor「);

但是,這似乎與調整的文檔不一致,其中指出xs需要是一個結構。

任何意見讚賞,因爲我認爲我失去了一些基本的理解。

回答

2

問題是,Hana使用函數式編程術語,其中函數表示與C++中通常用來表示的內容不同的東西(即函數對象)。

在簽名adjust

(auto&& xs, auto&& value, auto&& f) 

調整:F(T)×U×(T→T)→F(T)

然後xs是F(T ),Functor over T; f是(T→T),函數對象將T的值映射到T

這裏的另一個問題是,小寫字母和大寫字母F表示簽名內的不同對象。

不是函子,其不變的,因爲這至多出現一次值。如果您要更換make_setmake_tuple(並確保您的f返回一個值),你的代碼可以編譯(Example):

auto t = hana::make_tuple(hana::type_c<int>, hana::type_c<float>); 
hana::adjust(t, hana::type_c<int>, [](auto x){ std::cout << typeid(x).name() << std::endl; return x; }); 

然而,你可能不應該在這裏使用hana::adjust,因爲你不關心返回值;相反,使用hana::filterhana::for_eachExample):

auto s = hana::make_set(hana::type_c<int>, hana::type_c<float>); 
hana::for_each(hana::filter(hana::to_tuple(s), hana::equal.to(hana::type_c<int>)), 
       [](auto x){ std::cout << typeid(x).name() << std::endl; }); 
+0

非常感謝;在這個層面上,我肯定有很多東西要學習功能和元編程。 另一方面,哈哈提供了一種方式來獲取類型集合並根據其中一個匹配執行函數,而無需線性搜索列表。即執行查找表如呼叫? – AKB

+0

@AKB你可能想要'hana :: contains'(它返回'hana :: true_'或'hana :: false_')或'hana :: find'(它返回'hana ::只是<...>'或'hana :: nothing')。這兩種方法都可以在'hana :: set'上高效地工作。 – ecatmur