: 변수 내부표준 : TR1 :: mem_fn을 반환 형식
std::tr1::mem_fn(&ClassA::method);
는,이 변수의 유형은 무엇입니까?
또한MagicalType fun = std::tr1::mem_fn(&ClassA::method);
, std::tr1::bind
의 결과 유형은 무엇입니까 :
과 같이 보일 것이다?
감사합니다.
: 변수 내부표준 : TR1 :: mem_fn을 반환 형식
std::tr1::mem_fn(&ClassA::method);
는,이 변수의 유형은 무엇입니까?
또한MagicalType fun = std::tr1::mem_fn(&ClassA::method);
, std::tr1::bind
의 결과 유형은 무엇입니까 :
과 같이 보일 것이다?
감사합니다.
std::tr1::mem_fn
및 std::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::function
에 std::tr1::mem_fn
의 결과를 저장할 수
std::tr1::function<void(ClassA&)> memfun_wrap(std::tr1::mem_fn(&ClassA::Func));
mem_fn
및 bind
의 반환 형식이 입니다 불특정. 즉, 인수에 따라 다른 종류의 객체가 반환되며이 표준은이 기능을 구현해야하는 방법에 대한 세부 사항을 규정하지 않습니다.
특정 라이브러리 구현에서 특정 유형이 어떤 것인지 알아 내고 싶다면 (이론적 인 이익을 위해) 항상 오류가 발생할 수 있으며 오류 메시지에서 유형을 가져올 수 있습니다. 예 :
#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);
기능은 (당신이 이렇게도 반환 형식 참조) 다음과 같은 방법으로 구현 될 수있다 :이 작업을 시도 할 수 있습니다 코드는 여기 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;
}
코드에 대한 설명/설명을 제공해 주시겠습니까? – kvorobiev
컴파일, 뭐가 잘못 됐어? – Tarantula
@Tarantula :'mem_fn'에 의해 반환 된 호출 가능한 객체는 포인터가 아닌 참조를 취합니다. 업데이트 된 답변을 참조하십시오. –
여전히 작동하지 않습니다. Func의 프로토 타입은 다음과 같습니다. virtual void Func (MyType * argument) = 0; – Tarantula