是否有可能具有一個成員變量,這將能夠計算指針從指針包含對象本身(在它的方法)?C++類的成員變量知道其自己的偏移
讓我們對外調用接口包裹在API這樣的:
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);
};
,同樣爲0參數其他號碼N.有關外方每個類,一個C++類被聲明爲一些特徵,並且此模板使用這些特徵(以及更多特徵用於參數類型)來查找和調用外部方法。這可以用於像:
Foo foo;
MethodProxy<Foo, barId, void()(int)> bar;
bar(foo, 5);
現在我想在做這樣的方式被定義Foo
什麼,我可以調用,如:
Foo foo;
foo.bar(5);
沒有多次重複簽名。(顯然創建靜態部件和包裝的方法中的呼叫是簡單,右)。那麼,事實上,這仍然很容易:
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」類型的工作,但實際上任何非虛成員,其中這將是工作。我也有類似的試圖通過指針─(即)-member在這樣的說法(使用虛擬基類),但這並不工作。
請注意,如果這樣工作,它也可以用來實現委託給包含類的方法的C#類屬性。
我知道如何用boost.preprocessor做上面提到的包裝器方法,但參數列表必須以奇怪的形式指定。我知道如何編寫宏以通過模板生成泛型包裝,但這可能會導致較差的診斷。如果這些電話看起來像foo.bar()(5)
,這也是微不足道的。但我想知道一些聰明的把戲是否有可能(加上只有這樣的巧招很可能是對的屬性可用太)。
注意:成員類型不能實際專用於指向它的成員指針或它的偏移量,因爲在指定偏移量之前必須知道類型。這是因爲該類型可能會影響所需的對齊(考慮顯式/特殊專業化)。
,我讀了好幾次,但仍然沒有得到你想要做什麼,你想要一個通用的*屬性*類是知道的它擁有什麼 - 如果是這樣,爲什麼它需要知道它擁有什麼?我應該想象一個屬性真正需要的是接受價值並返回價值的能力嗎? – Nim 2011-02-08 19:07:52
我也不明白。你想做什麼? – mfontanini 2011-02-08 19:13:10
@Nim:是的,我想要一個通用的「屬性」類,它知道它擁有什麼。對於財產,如果財產價值應該*計算*,則是必要的。在我的情況下,它是一個仿函數,它需要將指針傳遞給所有者到底層方法。 – 2011-02-08 19:47:57