나는 작은 대리인 연습 문제를 만들기 위해 노력 해왔다. 1.) 나 자신을 더 잘 이해하고, 2. 템플릿 메타 프로그래밍을 잘 이해하고, 3.) 이벤트 위주 프로그래밍을 위해 델리게이트를 사용하기도했다. 나는 표준 라이브러리에 접근 할 수 없다.) this 대답에 따르면, 다음과 같은 함수 구현 될 수C++ 대리인 연습
template <typename T, typename R, typename ...Args>
R proxycall(T & obj, R (T::*mf)(Args...), Args &&... args)
{
return (obj.*mf)(args...);
}
proxycall(myobj, &MyObj::func);
그것은 컴파일러가 리턴 타입, 클래스 유형 및 매개 변수 유형을 알아낼 수있는 것처럼 보인다 단지 템플릿에 myobj
및 &MyObj::func
를 전달하여 . 위와 같은 메서드를 사용하여 대리자 클래스 (개체에 대한 참조와 멤버 함수에 대한 포인터를 모두 저장하는 클래스)를 만들 수 있습니까?
Delegate d(myobj, &MyObj::func); /* Preferred */
또는
Delegate<myobj, &MyObj::func> d; /* Ok */
다음 클래스 내 Delegate 클래스이며, 이는 ReturnType
를 지정할 필요 불행한 부작용과 해당 멤버 함수의 Parameters
의 형태를 갖는다. 위에서 보았 듯이, 컴파일러는 그 것을 알아낼 수 있습니다. 그렇다면 컴파일러에서 어떻게 도와 줄 수 있습니까?
template <class Class, typename ReturnType, typename ... Parameters>
class Delegate {
public:
typedef ReturnType (Class::*Method)(Parameters ... params);
Delegate(Class& ref, Method m) : obj(ref), method(m) {}
ReturnType operator()(Parameters ... params) { return (obj.*method)(params...); }
ReturnType Invoke(Parameters ... params) { return operator()(params...); }
private:
Class& obj;
Method method;
};
/* Usage */
Delegate<MyObj, void> d(myobj, &MyObj::func);
^^^^^^^^^^^
ick
나는'당신이 ...'표준 앞으로 (인수를) :: ...'대신'인수의가 있어야 proxycall''에서, 틀리지 않는 경우. –
cdhowie