2010-08-02 5 views
5
나는이 결과 넣을

: 변수 내부표준 : TR1 :: mem_fn을 반환 형식

std::tr1::mem_fn(&ClassA::method); 

는,이 변수의 유형은 무엇입니까?

또한
MagicalType fun = std::tr1::mem_fn(&ClassA::method); 

, std::tr1::bind의 결과 유형은 무엇입니까 :

과 같이 보일 것이다?

감사합니다.

답변

4

std::tr1::mem_fnstd::tr1::bind의 반환 유형은 지정되지 않았습니다.

당신은 std::tr1::function A의 std::tr1::bind의 결과를 저장할 수 있습니다 :

struct ClassA { 
    void Func() { } 
}; 

ClassA obj; 
std::tr1::function<void()> bound_memfun(std::tr1::bind(&ClassA::Func, obj)); 

당신은 또한 std::tr1::functionstd::tr1::mem_fn의 결과를 저장할 수

std::tr1::function<void(ClassA&)> memfun_wrap(std::tr1::mem_fn(&ClassA::Func)); 
+0

컴파일, 뭐가 잘못 됐어? – Tarantula

+0

@Tarantula :'mem_fn'에 의해 반환 된 호출 가능한 객체는 포인터가 아닌 참조를 취합니다. 업데이트 된 답변을 참조하십시오. –

+0

여전히 작동하지 않습니다. Func의 프로토 타입은 다음과 같습니다. virtual void Func (MyType * argument) = 0; – Tarantula

2

mem_fnbind의 반환 형식이 입니다 불특정. 즉, 인수에 따라 다른 종류의 객체가 반환되며이 표준은이 기능을 구현해야하는 방법에 대한 세부 사항을 규정하지 않습니다.

특정 라이브러리 구현에서 특정 유형이 어떤 것인지 알아 내고 싶다면 (이론적 인 이익을 위해) 항상 오류가 발생할 수 있으며 오류 메시지에서 유형을 가져올 수 있습니다. 예 :

#include <functional> 

struct X 
{ 
    double method(float); 
}; 

int x = std::mem_fn(&X::method); 

9 Untitled.cpp cannot convert 'std::_Mem_fn<double (X::*)(float)>' to 'int' in initialization 

이 경우 유형의 이름은 내부 용으로 예약되어 있습니다. 코드에서 앞에 밑줄 (대문자)이있는 문자는 사용하지 마십시오. C++ 0X에서

, 나는 반환 형식이 될 것이라고 생각 auto :

auto fun = std::mem_fn(&ClassA::method); 
0

기능은 (당신이 이렇게도 반환 형식 참조) 다음과 같은 방법으로 구현 될 수있다 :이 작업을 시도 할 수 있습니다 코드는 여기 http://webcompiler.cloudapp.net/입니다. 아쉽게도 C++ 11 표준의 일부인 가변 템플릿 인 https://en.wikipedia.org/wiki/Variadic_template을 사용합니다. `하지만하지 않습니다, 나는 재미 = 표준이 :: TR1 :: mem_fn을 (를 ClassA :: 방법)`표준 : TR1 :: 기능 <무효 (*합니다 MyType)를>를 사용하기 위해 노력하고있어

#include <iostream> 
#include <string> 

template <class R, class T, class... Args > class MemFunFunctor 
{ 
    private: 
    R (T::*mfp)(Args...); //Pointer to a member function of T which returns something of type R and taking an arbitrary number of arguments of any type 

public: 
    explicit MemFunFunctor(R (T::*fp)(Args...)):mfp(fp) {} 

    R operator()(T* t, Args... parameters) 
    { 
     (t->*mfp)(parameters...); 
    } 

}; 

template <class R,class T, class... Args> MemFunFunctor<R,T,Args... > my_mem_fn(R (T::*fp)(Args...)) 
{ 
    return MemFunFunctor<R,T,Args... >(fp); 
} 


class Foo //Test class 
{ 
    public: 
     void someFunction(int i, double d, const std::string& s) 
     { 
      std::cout << i << " " << d << " " << s << std::endl; 
     } 
}; 


int main() //Testing the above code 
{ 

    Foo foo; 
    auto f = my_mem_fn(&Foo::someFunction); 

    f(&foo, 4, 6.7, "Hello World!"); //same as foo.someFunction(4, 6.7, "Hello World!"); 

    return 0; 
} 
+0

코드에 대한 설명/설명을 제공해 주시겠습니까? – kvorobiev