2016-10-29 4 views
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; 
} 

'()', 즉. resulttype<int>이 포함될 것으로 예상되는 위치와 일치하는 유형이 없습니다.

부스트 1.62와 함께 제공되는 Boost.Hana 버전을 사용하고 있습니다.

+1

, 당신은 당신의 기능을 단순화 할 수 있습니다 :

(void)hana::traits::declval(t) + hana::traits::declval(t) 

는 예상 한 결과 다음

((void)hana::traits::declval(t)) + hana::traits::declval(t) 

와 같은 수익률이다 '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)이라고 불린다. –

+0

@LouisDionne 예. 문제가있는 축소 된 예제의 부작용이 더 많습니다. –

답변

4

운영자 우선 순위에 문제가 있습니다. 그런데

(void)(hana::traits::declval(t) + hana::traits::declval(t)) 

demo

+0

감사합니다. –