「中間」ファンクタとは、コール時に引数の1つを指定できる通常のファンクタです。問題はアニメーションタイムライン(本質的には特定のフレームでスカラー値)があり、その出力がアニメーション対象のオブジェクト内のゲッター/セッターメソッドとの間でパイプされる必要があることです。ここに私がしようとしていたかの簡単な例です: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_;
};
タイムラインだけで山車を保持しているので、それはgetter/setterメソッドだために、オブジェクトが使用するスカラーどんなタイプ、(キャストする必要があり、私はそのフロートのための部分的な特殊化を持っていますキャストをしない)。 ObjType
はアニメーションオブジェクトタイプで、Getter
とSetter
はメソッドへのポインタであり、Scalar
はゲッターとセッターのタイプで、対処が予定されています。
これはうまくいくと思いましたが、ゲッター/セッターの中にはデフォルトで初期化された他の引数がいくつかあるため、コンパイルに失敗しました。私はこれが問題になるとは思わなかった、なぜなら彼らはデフォルトだからだ!しかし、コンパイラが、私が提供していたよりもポインタへのメソッドの引数が多くなると予想したとき、それは失敗しました。
私はvariadicのテンプレートargsを使用してみましたので、デフォルト値を手動で入力することができましたが、パラメータパックをメンバとして格納することができないため、最初のハードルに落ちました。 - 方法。私はstd :: functionとstd :: bindも見てきましたが、getter/setterメソッドのデフォルトのargsプリセットを持つメンバとしてstd :: functionを格納できることを期待していました。呼び出し直前のタイムライン。私はそれを行う方法を見つけることができません...
私が目指していることを達成するための提案はありますか?または、私のデザインに根本的に欠陥があり、より簡単なアプローチがありますか?
私はラムダを使う言い訳を見つけようとしています!ありがとう、私はそれを行って、私はどのように乗っているかを教えてあげるよ。 – cmannett85
美しい作品です。素晴らしいソリューションです。 – cmannett85