'중간 펑터'가 의미하는 것은 : 일반적인 펑터로서, 인수 중 하나를 호출 시간에 지정할 수 있습니다. 문제는 필자가 애니메이션 타임 라인 (특정 프레임에서 본질적으로 스칼라 값)을 가지고 있으며이 출력은 애니메이션을 생성 할 객체 내에서 getter/setter 메서드로 /에서 파이프되어야한다는 것입니다. 여기에 내가 시도하고 있었는지의 간단한 예는 다음과 같습니다C++ '중급'펑터를 만들려고 시도합니다.
template < class ObjType, class Getter, class Setter, typename Scalar >
class Sy_propertyBridge : public Sy_abstractPropertyBridge
{
public:
Sy_propertyBridge(ObjType* object, Getter getter,
Setter setter)
: obj_(object), get_(getter),
set_(setter) {}
virtual ~Sy_propertyBridge() {}
inline virtual float get() const
{
// Cannot handle default arguments.
Scalar tmp = (obj_->*get_)();
return static_cast<float>(tmp);
}
inline virtual void set(float value)
{
Scalar tmp = static_cast<Scalar>(value);
(obj_->*set_)(tmp);
}
private:
ObjType* obj_;
Getter get_;
Setter set_;
};
타임 라인은 수레를 보유하고, 그래서 어떤 스칼라가 나는 수레에 대한 부분 전문성을 가지고 (게터/세터 방법은, 주조되어야의의 객체가 사용하는 입력이 캐스트와 함께하지 않습니다.) ObjType
은 애니메이션 객체 유형이고 Getter
및 Setter
은 메소드에 대한 포인터이며 Scalar
은 Getter 및 Setter 유형이며 처리 할 것으로 예상됩니다.
나는 괜찮을 거라 생각했지만 일부 getter/setter가 다른 default-initialised 인수를 가지고 있기 때문에 컴파일이 실패했다. 나는 이것이 문제가 될 것이라고 생각하지 않았다. 그러나 컴파일러가 포인터보다 메서드에 대한 인수가 예상보다 많아 졌을 때 실패했습니다.
가변 변수 템플릿 args를 사용하여 기본 값을 직접 입력 할 수 있었지만 포인터가있는 args로 반복적으로 적용될 멤버로 매개 변수 팩을 저장할 수 없으므로 첫 번째 장애물에 빠졌습니다. -행동 양식. std :: function과 std :: bind를 살펴 봤는데 getter/setter 메서드의 기본 args 사전 설정과 함께 멤버로 std :: function을 저장할 수 있기를 바랬습니다. 전화하기 바로 전에 타임 라인. 오직 내가 할 수있는 방법을 찾을 수 없습니다 ...
누구를위한 목표를 달성하기 위해 어떤 제안이 있습니까? 또는 내 디자인에 근본적인 결함이 있으며 쉬운 접근 방법이 있습니까?
나는 람다를 사용하는 핑계를 찾으려고 노력해 왔습니다! 고마워, 나는 그것을 줄 것이고, 내가 어떻게 일어나는지 알려줄 것이다. – cmannett85
아름답게 작동하며 환상적인 솔루션입니다. – cmannett85