템플릿 펑터를 만들려고합니다.이 펑션 툴은 매개 변수 개수에 관계없이 인자 객체 및 멤버 함수로 사용됩니다. 템플릿으로 코드를 올바르게 작성하는 방법을 알 수 없습니다.모든 매개 변수가있는 템플릿 펑크 터
template<typename ItemT,
class T,
typename ...Args>
struct Builder
{
ItemT operator()(T& object, ItemT (T::*method)(Args...), Args && ... args)
{
return (object.*method)(std::forward<Args>(args)...);
}
};
struct Object
{
int method(int, int, int) { return 4; }
};
int main()
{
Object obj;
Builder<int, Object>()(obj, &Object::method); // Error here
}
매개 변수없이 개체 :: 메서드를 컴파일하면 코드가 컴파일됩니다. 그러나 매개 변수가있는 경우 - 아니요.
설명 프로젝트 파일 라인 억제 상태가 오류 C2664 'INT 빌더 :: 연산자() (T &, ItemT (객체 __thiscall :: *) (무효)가)'심각도 코드 : INT '에서 인수 2를 변환 할 수 없습니다 (__thiscall Object :: *) (int, int, int) 'to'int (__thiscall Object :: *) (void) '초안 c : \ drafts \ main.cpp 139
당신이'Builder' 객체를 선언했을 때'typename ... Args'가 무엇인지 정의하는 것을 잊어 버렸습니다. – NathanOliver
당신은'Builder'를 필요로합니다. 그리고 실제로'Object :: method'가 원하는 3 개의 int를 인수로 전달해야합니다. 보다 일반적으로, 운동의 요점이 무엇인지는 명확하지 않습니다. 당신은 정말로 어떤 문제를 해결하려고합니까? –
네이선이 말한 바. 표준 라이브러리가 객체를 생성하는 다양한 "make_ *"자유 함수를 제공하는 이유이기도합니다. 따라서 템플릿 인수의 공제가 발생할 수 있습니다. C++ 1z를 사용하면 생성자는 클래스의 템플릿 매개 변수를 추론하여 코드를 유효하게 만들 수 있습니다. – StoryTeller