2014-03-07 3 views
0

나는 reference_wrapper를 사용하여 reference_wrapper ctor로 전달 된 객체를 반환하는 functor를 생성 할 수 있다고 생각했습니다. 그러나 이것은 효과가 없습니다. 내가 잘못하고 있니? 그렇다면 더 좋은 방법이 있습니까? 나는 람다 (lambda)를 쓸 수 있는데, 그렇게해서는 안되는 것처럼 보입니다.reference_wrapper 원문 참조

#include <iostream> 
#include <functional> 
using namespace std; 

void funPtrPrinter(function< int(void) > output) 
{ 
    cout << output() << endl; 
} 

int main(void) 
{ 
    int thirteen = 13; 
    auto refWrap = ref(thirteen); 
    funPtrPrinter(refWrap); 
} 

답변

0

그래서이 std::integral_constant를 사용하여이 작업을 수행하는 방법입니다 :

const int thirteen = 13; 
auto refWrap = bind(&std::integral_constant< int, thirteen >::operator int, std::integral_constant< int, thirteen >()); 

이 문제를 해결 않지만, 모든 의도와 목적을 위해 람다 열등하다 :

const int thirteen = 13; 
auto refWrap = [=](){ return thirteen; }; 
1

std::reference_wrapper은 펑터를 생성하지 않습니다. 원래 유형이 Callable - std::reference_wrapper::operator() 인 경우에만 저장된 참조가 호출 가능 유형 인 경우에만 사용할 수 있습니다.

펑터가 왜 필요한지는 명확하지 않지만, 그렇다면 람다가 가장 간단한 해결책 일 수 있습니다.

0

reference_wrapper은 참조하는 객체가 호출 가능한 경우에만 호출 가능합니다. 그것의 operator()은 단순히 참조 된 호출 가능한 객체를 호출합니다. 에 언급 된 객체가 호출 가능하지 않으면 operator()이 존재하지 않습니다. 그런 의미에서 "진짜"참조처럼 행동합니다.

refWrap()thirteen()과 동일하므로 병이 형성됩니다.

0

std::reference_wrapper::operator()은 호출 가능 객체를 래핑하는 경우에만 오버로드 확인에 참여합니다. int은 하나가 아니므로 사용자가 요구하는 것은 작동하지 않습니다.

이 작업을 수행 할 수 있습니다 :

int thirteen = 13; 
auto refWrap = bind([&thirteen] { return thirteen; }); 
funPtrPrinter(refWrap); 

지금 당신은 호출의 bind 표현이 있고, 그는 funPtrPrinter() 내에서 호출 할 수 있습니다.

내가 너라면, 나는 중매인을 건너 뛰고 람다를 건너 뛸 것이다.

int thirteen = 13; 
funPtrPrinter([&thirteen] { return thirteen; }); 
+0

왜 'bind'? 람다 표현식은 이미 호출 가능합니다. – Oktalist

+0

@Oktalist 아직도 편집 :) OP는 그가 람다 (그러나 왜)를 사용하고 싶지 않았다고 언급 했으므로 대안을 시연했습니다. – Praetorian

+0

이것은 실제로 bind 내에서 람다를 사용합니다. –

2

구성원 변수에도 비슷한 기능이 있습니다. 어쩌면 당신은 그것을 혼란스럽게했을 것입니다. 공용 멤버 변수와 클래스가있는 경우

struct foo { int bar; }; 

, 당신은 변수의 값을 반환 펑터를 만들 std::mem_fnstd::bind를 사용할 수 있습니다.

auto f = std::mem_fn(&foo::bar); 
std::cout << f(foo{42}) << '\n'; 

auto g = std::bind(&foo::bar, foo{42}); 
std::cout << g() << '\n'; 
+0

이것은 거의 정확히 내가 필요로하는 것입니다 ...하지만 이전의 스택 변수에서는 사용할 수 없습니다. –