문제

특정 구조체의 경우:

struct foo
{
    void fooFunc(){}
    int fooVar = 0;
};

함수에 대한 호출 wapper를 만들 수 있습니다. std::mem_fn( &foo::fooFunc ) 이를 다른 메소드에 전달하고 객체에서 호출할 수 있습니다.
유사한 호출 래퍼가 있지만 멤버 변수에 대한 것이 있는지 알고 싶습니다.

예를 들어 여기서는 멤버 변수에 대한 포인터를 사용하고 있지만 호출 래퍼를 사용하고 싶습니다.

void bar( std::function< void( foo ) > funcPtr, int foo::* varPtr )
{
    foo myFoo;
    funcPtr( myFoo );
    foo.*varPtr = 13;
}
도움이 되었습니까?

해결책

NB귀하의 질문에는 STL(1990년대 라이브러리)의 내용이 없습니다. std::function 그리고 std::mem_fn C++ 표준 라이브러리의 일부이지만 동일한 것은 아닙니다.

std::mem_fn 멤버 함수와 멤버 변수를 지원하므로 다음과 같이 하면 멤버 변수에 액세스하고 설정할 수 있습니다.

foo f;
std::function<int&(foo&)> var( std::mem_fn( &foo::fooVar ) );
var(f) = 1;

다른 팁

회원 기능 외에도 std::mem_fn 데이터 멤버도 래핑하고 해당 멤버에 대한 읽기 액세스를 허용할 수 있습니다.따라서 다음이 작동합니다.

void print_fooVar(foo& f, std::function<int(foo)> varAccess)
{
    std::cout << varAccess(f) << std::endl;
}

foo f;
print_fooVar(f, std::mem_fn(&foo::fooVar)); // prints 0

JonathanWakely가 주석에서 언급했듯이 다음에서 반환된 (지정되지 않은) 유형을 사용할 수 있습니다. mem_fn 자체적으로 데이터 멤버를 설정합니다.

foo f;
std::mem_fn(&foo::fooVar)(f) = 13;

아니면 그것을 다른 것으로 변환하려면 std::function 사용

void bar( foo& f, std::function<int&(foo&)> fooVarSet )
{
    fooVarSet(f) = 26;
}

당신이 찾고 있는 것이 콜러블을 생성하여 fooVar 데이터 멤버, 사용하지 않음 std::mem_fn 특히 이를 위해 람다 표현식을 사용하여 작업을 완료할 수도 있습니다.

void bar( foo& f, std::function<void(foo)> funcPtr, 
                  std::function<void(foo&, int)> fooVarSet )
{
    funcPtr( f );
    fooVarSet(f, 13);
}

foo f;
bar(f, std::mem_fn(&foo::fooFunc), [](foo& f, int i) {f.fooVar = i;});

라이브 데모

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top