gpt4 book ai didi

C++ 试图创建一个 'Intermediate' 仿函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:56 24 4
gpt4 key购买 nike

我所说的“中间”仿函数的意思是:一个普通的仿函数,其中一个参数可以在调用时指定。问题是我有一个动画时间轴(本质上是特定帧的标量值),并且它的输出需要通过管道传入和传出要动画的对象中的 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_;
};

时间轴只包含 float ,因此无论对象用于它的 getter/setter 方法的任何标量类型,都必须强制转换(我有一个 float 的部分特化,它取消了强制转换)。 ObjType 是动画对象类型,GetterSetter 是指向方法的指针,Scalar 是类型Getter 和 Setter 以及预期的处理。

我认为这会很好,但是编译失败了,因为一些 getter/setter 有其他默认初始化的参数。我认为这不是问题,因为它们是默认的!但是,当编译器期望指向方法的指针的参数多于我提供的参数时,它失败了。

然后我尝试使用可变参数模板参数,因此可以手动输入默认值,但遇到了第一个障碍,因为我无法将参数包存储为成员,以便作为参数重复应用于指针 -方法。我也一直在研究 std::function 和 std::bind,我希望能够将 std::function 存储为具有 getter/setter 方法的默认参数预设的成员 - 并从调用之前的时间线。只是我找不到办法...

有没有人对实现我的目标有任何建议?还是我的设计存在根本性缺陷并且有更简单的方法?

最佳答案

std::function将是要走的路。将只使用 std::function<Scalar(const ObjType*)>作为你的 setter/getter ,std::function<void(ObjType*, Scalar)>作为您的二传手(如果 Scalar 可以隐式转换为 float s,我什至会分别使用 std::function<float(ObjType const*)>std::function<void(ObjType*, float)> )。您可以初始化这些,例如。使用 lambda 函数:

Sy_propertyBridge(my_obj, 
[](const MyObjType* o) -> float { return o->opacity; },
[](const MyObjType* o, float f) { o->opacity=f; })

请注意,可能有更优雅的方法来执行此操作(例如,可能只有一个函数可以同时用作 getter 和 setter)。

更进一步,你可以

  • 去掉 obj_成员变量
  • 去掉 o函数的参数

然后 lambda 表达式必须记住它们要操作的对象。所以上面的构造函数调用将变成

Sy_propertyBridge(
[]() -> float { return my_obj->opacity; },
[](float f) { my_obj->opacity=f; })

关于C++ 试图创建一个 'Intermediate' 仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com