是否有可能具有一个成员变量,这将能够计算指针从指针包含对象本身(在它的方法)?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