Новый для boost::hana
и пытается простой эксперимент, чтобы найти тип в наборе типов и просто напечатать его typeid.name
, Однако я получаю ошибки static_assert (ПРИМЕЧАНИЕ: Xcode 7.2.1)
Это код:
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 :: Adjust (xs, value, f) требует, чтобы ‘xs’ был Функтором»);
Однако это, кажется, расходится с документацией по настройке, в которой говорится, что xs
должна быть структура.
Любой совет оценен, так как я предполагаю, что мне не хватает чего-то фундаментального в моем понимании.
Проблема в том, что Хана использует терминологию функционального программирования, где Функтор означает нечто отличное от того, что обычно используется в С ++ (то есть объект функции).
В подписи adjust
:
(auto&& xs, auto&& value, auto&& f)
отрегулируйте: F (T) × U × (T → T) → F (T)
затем xs
это F (T), а Функтор над T; f
is (T → T), функциональный объект, который отображает значения T в T.
Другая проблема заключается в том, что строчные и прописные буквы F относятся к разным объектам в сигнатуре.
Задавать это не Функтор, из-за его инварианта значения встречаются не более одного раза. Если вы замените make_set
с make_tuple
(и убедитесь, что ваш f
возвращает значение), ваш код скомпилируется (пример):
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
(пример):
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; });
Других решений пока нет …