Повысить Хану найти тип в наборе

Новый для 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 должна быть структура.

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

1

Решение

Проблема в том, что Хана использует терминологию функционального программирования, где Функтор означает нечто отличное от того, что обычно используется в С ++ (то есть объект функции).

В подписи 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; });
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector