2016-07-26 5 views
1

Новое в boost::hana и попробуйте простой эксперимент, чтобы найти тип в наборе типов и просто распечатайте его typeid.name. Однако я получаю ошибки static_assert (Примечание: Xcode 7.2.1)Boost hana find type 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; }); 

Ошибка:

«Hana :: подстраиваться (Xs, значение, f) требует, чтобы xs был функтором);

Однако это, похоже, противоречит документации по настройке, которая гласит, что xs должен быть структурой.

Любые советы, оцененные, поскольку я предполагаю, что у меня отсутствует что-то фундаментальное в моем понимании.

ответ

2

Проблема заключается в том, что Hana использует терминологию функционального программирования, где Functor означает что-то отличное от того, что обычно используется для обозначения в C++ (т. Е. Объект функции).

В подписи для adjust:

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

регулировки: Р (Т) × U × (T → T) → Р (Т)

затем xs является Р (Т), a Функтор over T; f - (T → T) - функциональный объект, который отображает значения T - T.

Другая проблема заключается в том, что строчные и прописные буквы F относятся к различным объектам внутри подписи.

Набор не Functor, из-за его инвариант значения встречаются более одного раза. Если заменить make_set с make_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::filter с hana::for_each (Example):

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 :: just <...>' или 'hana :: nothing'). Обе эти функции эффективно работают на 'hana :: set'. – ecatmur

Смежные вопросы