2
축소 된 예제에서는 튜플에 두 가지 유형이 있고 표현식이 유효한 유형 만 포함하는 다른 튜플을 작성하려고합니다 (이 예에서는 + 연산자를 사용하고 있습니다).표현식이 Boost.Hana에서 유효한지 여부에 따라 어떻게 튜플 유형을 필터링합니까?
내 시도가 너무 같다 : 이것은 출력
#include <boost/hana.hpp>
#include <boost/hana/experimental/printable.hpp>
#include <iostream>
namespace hana = boost::hana;
struct foo {};
const auto result{hana::filter(hana::tuple_t<int, foo>, [](auto type) {
const auto has_plus{hana::is_valid([](auto t)
-> decltype((void) hana::traits::declval(t) + hana::traits::declval(t)) {})};
return has_plus(type);
})};
int main()
{
std::cout << hana::experimental::print(result) << std::endl;
}
'()', 즉. result
에 type<int>
이 포함될 것으로 예상되는 위치와 일치하는 유형이 없습니다.
부스트 1.62와 함께 제공되는 Boost.Hana 버전을 사용하고 있습니다.
, 당신은 당신의 기능을 단순화 할 수 있습니다 :
는 예상 한 결과 다음와 같은 수익률이다 'hana :: filter (hana :: tuple_t, hana : : () : ) -> decltype ((hana :: traits :: declval (t) + hana :: traits :: declval (t))) {} 이 변환은 [] (자동 x) {return f (x); }'그냥'f'라고하는 것은 [eta-reduction] (https://en.wikipedia.org/wiki/Lambda_calculus#.CE.B7-conversion)이라고 불린다. –
@LouisDionne 예. 문제가있는 축소 된 예제의 부작용이 더 많습니다. –