2016-07-06 2 views
0

인수 (매개 변수 팩)를 저장하고 인수를 다른 함수에 전달해야합니다.
그 결과 나는 람다를 사용할 수 없습니다. 그리고 좋은 선택은 std :: bind입니다.
그러나이 코드완벽한 전달을 사용하는 std :: bind operator() 호출

struct A{}; 

void test(A &&){} 

int main() 
{ 
    A a; 
    test(move(a)); //work 
    bind(test,a)(); //compile fail; copy a to std::bind, pass a to test 
} 

표준에 따르면, 표준에 저장된 모든 변수 :: 바인드 기능을 할뿐만 좌변 통과됩니다에 대한
. (C++ 표준에서는 그게 무슨 뜻인지는 모르겠다.)
그리고 std :: bind와 함께 함수에서 rvalue 참조를 사용할 수 없다는 것을 의미합니다.

test(A &&)test(A &)으로 변경하는 것이 하나의 방법이지만이 방법은 프로젝트에만 적용됩니다. 또한 std :: thread로 테스트를 호출 할 필요가있을뿐만 아니라 일반 순차 호출로 테스트를 호출해야하는 경우에는 이상하게 만듭니다.

그래서이 문제를 해결할 방법이 있습니까?

+4

* "나는 람다"를 사용할 수 없습니다 *, 당신은 그것에 대해 자세히 설명 할 수 있습니까? 그리고 당신이 언급하는 매개 변수 팩은 어디에 있습니까? –

+0

@ NathanOliver 당신은'foo'에게 전화하는 걸 잊었습니다 –

+0

@PiotrSkotnicki 좋은 지적입니다. 나는 그것을했고 그것은 장관적으로 실패했다. – NathanOliver

답변

1
당신은를 rvalue 참조 (같은 reference_wrapper/L 값 참조)로 전환하고 bind와 함께 사용합니다 래퍼 만들 수 있습니다

: 그것은 칼이 같이

을 :

#include <iostream> 
#include <functional> 

struct A{}; 

void test(A &&){ std::cout << "Works!\n"; } 

template <typename T> 
struct rvalue_holder 
{ 
    T value; 
    explicit rvalue_holder(T&& arg): value(arg) {} 
    operator T&&() 
    { 
     return std::move(value); 
    } 
}; 

template <typename T> 
rvalue_holder<T> rval(T && val) 
{ 
    return rvalue_holder<T>(std::move(val)); 
} 

int main() 
{ 
    A a; 
    test(std::move(a)); //work 
    auto foo = std::bind(test, rval(std::move(a))); //works 
    foo(); 
} 

http://coliru.stacked-crooked.com/a/56220bc89a32c860

참고 : rvalue_holder 및 특히 rval은 모든 경우에 효율성, 견고성 및 원하는 동작을 보장하기 위해 추가 작업이 필요합니다.

+0

좋아요. 하지만이 솔루션을 사용하지 못할 수도 있습니다. 감사. – Caesar