2017-03-01 73 views
2

我有一个boost :: hana :: set类型的集合,并且想要用它创建一个映射,其中的值是bool的。boost hana:从一个集合和一个默认值创建一个映射

// I have a hana set: 
auto my_set = hana::make_set(hana::type_c<int>, hana::type_c<float> ...); 

// and want to transform it to a map with a given runtime value as values: 
auto wanted_map = hana::make_map(
    hana::make_pair(hana::type_c<int>, false), 
    hana::make_pair(hana::type_c<float>, false), 
    ... 
); 

回答

1

hana::sethana::Foldable所以你可以使用hana::unpack。考虑下面这个例子:

#include <boost/hana.hpp> 

namespace hana = boost::hana; 


int main() { 
    constexpr auto make_pair_with = hana::curry<2>(hana::flip(hana::make_pair)); 

    auto result = hana::unpack(
    hana::make_set(hana::type_c<int>, hana::type_c<float>), 
    hana::make_map ^hana::on^ make_pair_with(false) 
); 

    auto expected = hana::make_map(
    hana::make_pair(hana::type_c<int>, false), 
    hana::make_pair(hana::type_c<float>, false) 
); 

    BOOST_HANA_RUNTIME_ASSERT(result == expected); 
} 
+0

大,谢谢! :-D –

1

贾森的回答是完美的,但这里的使用Lambda而不是同样的事情(我通常会发现更易读):

#include <boost/hana.hpp> 
namespace hana = boost::hana; 


int main() { 
    auto types = hana::make_set(hana::type_c<int>, hana::type_c<float>); 
    auto result = hana::unpack(types, [](auto ...t) { 
    return hana::make_map(hana::make_pair(t, false)...); 
    }); 

    auto expected = hana::make_map(
    hana::make_pair(hana::type_c<int>, false), 
    hana::make_pair(hana::type_c<float>, false) 
); 

    BOOST_HANA_RUNTIME_ASSERT(result == expected); 
}