メンバ変数を持つことは可能ですか?それを含むオブジェクトへのポインタを自分自身へのポインタから計算することは可能ですか?C++クラスメンバ変数自身のオフセットを知っています
のは、このようなAPIに包まれた外国人のコール・インタフェースを持ってみましょう:外国側の各クラスについては0からNまでの引数の他の番号について
template <typename Class, MethodId Id, typename Signature>
class MethodProxy;
template <typename Class, MethodId Id, typename ReturnT, typename Arg1T>
class MethodProxy<Class, Id, ReturnT()(Arg1T) {
public:
ReturnT operator()(Class &invocant, Arg1T arg1);
};
と同様に、一つのC++クラスがいくつかで宣言されていますこのテンプレートはこれらの特性(および引数型のより多くの特性)を使用して、外部メソッドを検索して呼び出します。これは次のように使用することができます署名を複数回繰り返すことなく
Foo foo;
foo.bar(5);
:今、私がやりたいものを
Foo foo;
MethodProxy<Foo, barId, void()(int)> bar;
bar(foo, 5);
私は次のように呼び出すことができるような方法でFoo
を定義しています。(明らかに静的メンバーを作成し、メソッドで呼び出しをラップするのは簡単です、右)。実際、それはまだ簡単です:
template <typename Class, MethodId Id, typename Signature>
class MethodMember;
template <typename Class, MethodId Id, typename ReturnT, typename Arg1T>
class MethodMember<Class, Id, ReturnT()(Arg1T) {
MethodProxy<Class, Id, Signature> method;
Class &owner;
public:
MethodMember(Class &owner) : owner(owner) {}
ReturnT operator()(Arg1T arg1) { return method(owner, arg1); }
};
しかし、オブジェクトは多くの場合、それ自身へのポインタのコピーを多数含んでいます。だから私は、これらのインスタンスがthis
といくつかの追加のテンプレート引数から所有者のポインタを計算できるようにする方法を探しています。
私は
template <typename Class, size_t Offset, ...>
class Member {
Class *owner() {
return reinterpret_cast<Class *>(
reinterpret_cast<char *>(this) - Offset);
}
...
};
class Foo {
Member<Foo, offsetof(Foo, member), ...> member;
...
};
の線に沿って考えていたが、これはFooのがポイントで不完全な型であることを不平を言います。
はい、私はoffsetof
が "POD"タイプでしか動作しないと考えていますが、これが実際に動作する非仮想メンバーであれば実際に動作します。私は同様に、その引数にポインタ型(それ)のメンバ(ダミーのベースクラスを使用)を渡そうとしましたが、どちらも動作しません。
これが機能すれば、それを含むクラスのメソッドに委譲するC#のようなプロパティを実装することもできます。
私はboost.preprocessorで上記のラッパーメソッドを実行する方法を知っていますが、引数リストは奇妙な形式で指定する必要があります。私は、テンプレートを使ってジェネリックラッパーを生成するためにマクロを書く方法を知っていますが、それはおそらく貧弱な診断を与えるでしょう。呼び出しがfoo.bar()(5)
のように見える場合は、それも簡単です。しかし、私はいくつかの巧妙なトリックが可能であるかどうかを知りたがっています(しかもそのような巧妙なトリックだけがおそらくプロパティにも使えるでしょう)。
注:メンバ型は、オフセットを割り当てることができる前に型を知っていなければならないため、メンバ型へのメンバポインタまたはオフセット型のいずれにも特化できません。これは、型が必要な配置に影響する可能性があるためです(明示的/派生的な特殊化を考慮)。
は、私はそれを数回を読んで、まだあなたが何をしたいのか得ることはありません、あなたは認識しているジェネリック*不動産*クラスをしたいですかそれを所有するもの - もしそうなら、なぜそれを所有しているのかを知る必要がありますか?私は本当に必要とされるすべての財産が価値を受け入れて価値を返す能力であると想像すべきですか? – Nim
私はそれを取得しません..あなたは何をしようとしているのですか? – mfontanini
@ニム:はい、それを所有するものを認識している一般的な「プロパティ」クラスが必要です。プロパティーの場合は、プロパティー値を* computed *にする必要があります。私の場合、それは基本的なメソッドへのポインタを所有者に渡す必要があるファンクタです。 –