Boost.Hana тест, если лямбда вызывается с определенным аргументом - PullRequest
2 голосов
/ 09 июля 2019

Я хочу проверить, может ли лямбда callable вызываться с конкретными аргументами с помощью Boost.Hana. Компилятор жалуется, что callable ожидает 0 аргументов, но 1 был предоставлен. Разве if_ не время компиляции, если оно компилируется в зависимости от условия is_callable?

Может быть, у кого-то есть идея, как заставить код работать.

#include <boost/hana.hpp>

int main(){

  namespace bh = boost::hana;

  auto is_callable = bh::is_valid([](auto&& callable, auto&& args) -> decltype(bh::unpack(args, callable)){});        

  auto callable = [](){};
  auto arg = 1;
  auto args = bh::make_tuple(arg);

  bh::if_(is_callable(callable, args),
                   [arg](auto callable){ callable(arg);},
                   [](auto callable){})(callable);

  return 0;
}

1 Ответ

2 голосов
/ 09 июля 2019

Как отметил Джейсон Райс в комментариях, причина этого заключается в том, что hana::unpack не дружит с SFINAE. Самый простой способ обойти это - вызвать самих вызываемых для hana::is_valid, используя hana::unpack для распаковки аргументов в результат hana::is_valid:

auto const is_callable = [](auto&& callable, auto&& args) {
    return bh::unpack(args,
        bh::is_valid([&callable](auto&&... args)
            -> decltype(callable(args...))
        {})
    );
};

Демонстрация в реальном времени в Compiler Explorer

...