2010-04-07 2 views
3

C++ 0x는 및 bind2nd과 같은 이전 바인더의 사용을 일반용 std::bind으로 대체했습니다. C++ 0x lambdas는 std::bind으로 잘 묶이지 만 기본 람다는 중첩 된 typedef가 argument_type, first_argument_type, second_argument_typeresult_type과 같이 없기 때문에 기본 bind1st 및 bind2nd와 바인딩하지 않습니다. 그래서 나는 std::function이 필요한 typedef를 노출하기 때문에 lambdas를 이전 바인더에 바인딩하는 표준 방법으로 사용할 수 있다고 생각했습니다.더 이상 사용되지 않는 바인더 및 C++ 0x lambda 사용

그러나 std::function을 사용하면 인스턴스화하는 동안 함수 유형의 철자를 지정해야하므로이 컨텍스트에서는 사용하기가 어렵습니다.

auto bound = 
    std::bind1st(std::function<int (int, int)>([](int i, int j){ return i < j; }), 10); // hard to use 
auto bound = 
    std::bind1st(std::make_function([](int i, int j){ return i < j; }), 10); // nice to have but does not compile. 

std::function에 대한 편리한 개체 생성기를 찾을 수 없습니다. std::make_fuction과 같은 것이 좋을 것입니다. 그런 것이 있습니까? 그렇지 않다면 고전 바인더에 람다를 바인딩하는 다른 더 좋은 방법이 있습니까?

+0

lambda와 함께 클래식 바인더를 사용하면 기능 객체 유형이 위에서 언급 한 typedef를 노출 할 것으로 기대하는 레거시 라이브러리에 유용 할 수 있습니다. 그래서 저는 바닐라 람다가 그러한 라이브러리와 함께 사용될 수 있다고 생각하지 않습니다. – Sumant

답변

2

그런 시도를 해본 적이 없으며 완전한 대답을 제공 할 시간이 없지만 Boost.FunctionTypes로 수행 할 수 있다고 생각합니다. 나는 여전히 내가 생각할 수있는 유일한 것은 예전의 코드를 지원하는 것입니다 bind1st 등 필요한 이유를 모르는

template <typename T> 
struct AdaptedAsUnary : T 
{ 
    namespace bft = boost::function_types; 
    namespace bmpl = boost::mpl; 

    typedef typename bft::result_type<T>::type result_type; 
    typedef typename bmpl::front<typename bft::parameter_types<T>::type>::type argument_type; 

    AdaptedAsUnary(T t) : T(t) {} 
}; 

template <typename T> 
AdaptedAsUnary<T> 
AdaptAsUnary(T t) 
{ 
    return AdaptedAsUnary<T>(t); 
} 
+1

이것은 깔끔한 해결책입니다. 람다 (lambda) 타입으로부터 상속하는 것은 나에게 새롭고 g ++ 4.5에서 잘 작동한다. 오늘 현재 boost :: function_types (1.42)는 내장형 호출 가능 유형으로서 lambdas를 지원하지 않지만 나름의 길을 찾을 수있었습니다. 앞으로 그들이 그것을 지원할 때 (나는 희망한다),이 솔루션은 그대로 사용될 수있다. 지금은 boost :: function_types의 내성 기능 대신 http://stackoverflow.com/questions/2562320/specializing-a-template-on-a-lambda-in-c0x에 대한 대답을 사용했습니다. lambda에 대해 이러한 function_traits를 사용하면 T 및 std :: unary_function에서 다중 상속이 작동합니다. – Sumant

1

:

여기 당신에게 아이디어를 줄 수있는, 거친 불완전하고 검증되지 않은 초안입니다 . 사실 bind1st(f, a)[a](v){ return f(a, v); } 등으로 대체 할 수 있으며 이는 보편적 인 솔루션입니다.

관련 문제