Под «промежуточным» функтором я подразумеваю: нормальный функтор, в котором один из аргументов может быть указан во время вызова. Проблема в том, что у меня есть временная шкала анимации (по сути, скалярные значения в определенных кадрах), и вывод этого должен быть передан в и из методов получения/установки в объектах, которые нужно анимировать. Вот упрощенный пример того, что я пытался:
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, с которым должны иметь дело.
Я думал, что это будет нормально, но компиляция не удалась, потому что у некоторых геттеров/сеттеров были другие аргументы, инициализированные по умолчанию. Я не думал, что это будет проблемой, потому что они по умолчанию! Но когда компилятор ожидал больше аргументов для указателя на метод, чем я предоставил, он потерпел неудачу.
Затем я попытался использовать вариативные аргументы шаблона, чтобы значения по умолчанию можно было вводить вручную, но упал при первом же препятствии, потому что я не могу сохранить пакет параметров как член, который будет многократно применяться в качестве аргументов к указателю на методы. Я также просматривал std::function и std::bind, я надеялся сохранить std::function в качестве члена с предустановленными аргументами метода getter/setter по умолчанию - и изменить соответствующий аргумент для одного из временная шкала непосредственно перед звонком. Только я не могу найти способ сделать это...
Есть ли у кого-нибудь предложения по достижению того, к чему я стремлюсь? Или мой дизайн в корне ошибочен и есть более простой подход?