我所说的“中间”函子的意思是:一个普通函子,其中一个参数可以在调用时指定。问题是我有一个动画时间线(本质上是特定帧的标量值),并且它的输出需要通过管道传输到要设置动画的对象中的 getter/setter 方法。这是我尝试的一个简化示例:
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_;
};
时间线仅包含浮点数,因此无论对象用于其 getter/setter 方法的任何标量类型都必须进行转换(我对浮点数进行了部分专业化,从而消除了转换)。 ObjType
是动画对象类型,Getter
并且Setter
是指向方法的指针,并且Scalar
是 Getter 和 Setter 类型并期望处理。
我认为这会很好,但是编译失败了,因为一些 getter/setter 有其他默认初始化的参数。我不认为这会是一个问题,因为它们是默认的!但是当编译器期望方法指针的参数比我提供的更多时,它失败了。
然后我尝试使用可变参数模板 args,以便可以手动输入默认值,但由于我无法将参数包存储为成员,以便作为 args 重复应用于指向方法的指针,因此我遇到了第一个障碍。我也一直在研究 std::function 和 std::bind,我希望能够将 std::function 存储为具有 getter/setter 方法的默认 args 预设的成员 - 并从就在调用之前的时间线。只是我找不到办法做到这一点......
有没有人有任何建议来实现我的目标?还是我的设计存在根本缺陷并且有更简单的方法?