English 中文(简体)
物体的正确处理方法
原标题:True address of object s method

我知道,我可以创建方法点,我知道,这些点一般不同于职能点。 不允许它们之间发生争执。 方法学点可包含有关如何调整<条码>的>条码/代码>点等的许多数据。

我愿知道,如何找到执行特定方法的守则的实际地址。 这一地址不会以任何方式被忽略,而是会被用作特定方法所属类型的身份识别器,如RTTI,其好处是对有图书馆约束的人不敏感,因为只有一个单位才有这一代码。

EDIT:

Why i don t add some getType() method returning object s type?

因为我只想以这种方式使用我制造的课堂。 我试图做的是,基本上我执行“<代码>variant类别,只要存在某种类型的真空* 而基本上接受一切。

So then i could write:

template <typename T>
class getTypeId{
};

class foo{
    public:
    void bar();
};

// getTypeId declared but not defined for generic type T earlier...
template <>
class getTypeId<foo>{
    static void* get<foo>(){
        return &foo::bar;
    }
};

void doSomething(myVariant var);

int main(int argc, char* argv[]){
     foo f;
     myVariant var = myVariant::fromType<foo*>(&f);
     doSomething(f);
}

void doSomething(myVariant var){
    foo* f = var.toType<foo*>(); // Returns foo object from main
    int* i = var.toType<int*>(); // returns null, as var is not int* in my example.
}

设想是,上的 >正在使用getTypeId获取代表价值的类型,并将其与投到的[上的物体点相去。

这种解决办法的美容是,即使存在一些界定X型的共享图书馆X,但Y和Z的图书馆将单独使用X就X型号达成一致(例如,在Y类变体中,该变量被转至Z),因此在X上的地址:方法保持不变。 作为Y或Z图书馆的创建者(但NOT X!!) 我无需确保X的平衡使RTTI能够或甚至知道我的真实存在,但X的类型仍然完全符合我的变数。

EDIT:

I see by now that there is no implementation-independent way to get this done. However I think that this is quirk of not-usually-needed, and therefore not-existing feature, rather than feature that is impossible to create. I think I still haven t made it clear what I wanted to acheive and how I was plannig to do so. So:

  • 我通过图书馆这里指的是共享图书馆(代尔、索等等)。

  • 并非纯粹虚拟的每一种方法(定义的每一种方法)都必须得到执行。 这种执行是一种功能,接受一个附加参数<代码>,即——虚拟功能只在电线上有所不同。 举例来说,请采用X类,并采用<代码>X:foo。 这种方法只受X类的约束,即使Y类继承该方法,这种方法仍保留在<代码>X:foo<>/code>,因此,必须确定<代码>X。 校外法或儿童班子覆盖法Xchild Xchild:foo with new address. 然后,您可使用<代码>Xchild:foo,代表Xchild,但不得使用X

  • 如果在图书馆校准X中界定X类(其所有方法都是准确的),而校准和校准既使用校准X(但并不相互了解),也用X中第一种方法确定自己的目的(表示这不会对X开发商施加任何影响),那么他们就X类究竟是什么达成一致意见。 如果申请开发商使用校准号获取变量,然后通过校准进行校准,则两者都将适当承认上述类型。

  • 我是NOT,试图开发一种预测型-变型-变型-因为X可以读成X而节省的变量,即使实际点子传给我的变体是Xchild。 我不希望获得特定情况下最高级类别的类型——只是用来制造变量的类别。

最佳回答

C++ FAQ http://www.paragia.com/c++-faq-lite/pointers-to- members.html” 成员职务点。

Two answers in particular state why what you are trying to do cannot be done (at least, not in a portable way):

  • Pointer-to-member-function is a different animal:

C++ introduces a new type of pointer, called a pointer-to-member, which can be invoked only by providing an object. Do not attempt to "cast" a pointer-to-member-function into a pointer-to-function; the result is undefined and probably disastrous. E.g., a pointer-to-member-function is not required to contain the machine address of the appropriate function.

  • Pointer-to-member-functions can point at virtual functions:

A pointer to a member function might be a data structure rather than a single pointer. Think about it: if it s pointing at a virtual function, it might not actually be pointing at a statically resolvable pile of code, so it might not even be a normal address.

问题回答

我愿知道,如何找到执行特定方法的守则的实际地址。 这一地址不会以任何方式被忽略,而是会被用作特定方法所属类型的身份识别器,如RTTI,其好处是对有图书馆约束的人不敏感,因为只有一个单位才有这一代码。

RTTI is not limited by translation units. The only limitations of RTTI around libraries is the DLL boundary, where one DLL would expose a function that returns a derived class. And I m not 100% sure, but so long as the DLL and executable are all built with the same compiler (and share static libraries), I think it will still work.

In any case, what you re asking for cannot be done. A member pointer is not a pointer, and there is no portable way to get an actual function pointer to a member function.

即便是这样,它也不给你一种独特的识别特征。 毕竟,如果某一类别不凌驾于某一职能之上,或者如果该职能是虚拟的,则该成员的地址将与使用该职能的每个类别相同。 只有当功能是虚拟的,而且等级高于这一功能时,才会发生变化。

无法从中找到独一无二的识别特征。

It seems to me that what you want is Boost.Any, which uses RTTI internally to prevent you from casting to the wrong type.


The places where your plan breaks down

您正在提议履行以下职能:

template<typename T>
SomeIdentifierTypedef getTypeId(const T &x)
{
  void *ptr = GetMemberFuncPtr<T>(x, &x::foo);
  return FindIdFromPtr(ptr);
}

这要求有<条码>GetMemberFuncPtr,该编码带有成员点和物体,并具备该成员的实际职能点。 这项职能旨在收回其所收各类的独特价值。

页: 1

让我们把X类推到方法X:foo作为一个例子。 这种方法只受X类的约束,即使Y类继承了这种方法,但这种方法仍属X:foo,因此足以确定X类。

如果<代码>Y:foo和X:foo为同一成员职能,则自然具有相同的职能点。 因此,getTypeId(Y())=获取TypeId(X)(。 这违反了<代码>getTypeId的既定目标。 您希望回到different。 如果是Y类,其数值是X。

如果在图书馆校准X中界定X类(其所有方法都是准确的),而校准和校准既使用校准X(但并不相互了解),也用X中第一种方法确定自己的目的(表示这不会对X开发商施加任何影响),那么他们就X类究竟是什么达成一致意见。 如果申请开发商使用校准号获取变量,然后通过校准进行校准,则两者都将适当承认上述类型。

这不能出于两个原因。 首先,注意到我执行<代码>getTypeId:foo。 这是因为没有办法谈论一个阶级的任意方法。 你们必须使用一个名字(如果你愿意的话,很可能是完整的签名),以便谈论一个特定的职能。 您仅能说“我们、从这种类型中起的作用”。 你们必须去掉。

这就意味着,您必须选取same<>>>>> /em> ,用于所有可能的模板类型getTypeId。 因此,在must上,你使用<代码>getTypeId的所有类别都履行同样的职能。

奥赫,你可以尝试将其专门化用于某些类型。 但是,这还是第二大问题。

Shared libraries do not share functions, unless they are explicitly shared. You cannot share X::foo. The only way for libX to pass libY a class that libY does not have a full and separate definition for is if the class is hidden in some way. So either it s an opaque pointer (void*), in which case you can t even get member functions to it. Or it is a derived class from a definition that both libX and libY have.

也就是说,有一部分(可能抽象的)类别<编码>底线,这两类编码<代码>libX和libY汇编成。 X。 查阅<代码> 页: 1

在此情况下,专业确实有帮助,因为只有<代码>libX 才能进入专业getTypeId<X>。 唯一开展工作的途径是:getTypeId<base>。 但是,然后我们回头来看,如果用户不凌驾于虚拟功能之上,那么问题何在? 然后,我们认为它仍是一个<编码>底线

即使测试功能是一种纯粹的虚拟功能,也赢得了一定帮助。 这是因为libX 可使用<代码>。 缩略语 页: 1 可能已经履行了这一职能,但Ys>未超过该职能。 因此,getTypeId(x) ==sedTypeId(y)

你的想法不能奏效。

如果你只想从彼此中提取各种类型(主要是制造习惯的RTTI),那么你就能够创造一种恢复某种类型识别特征的方法。

class MyFirst
{
public:
    inline virtual string GetType() { return "Myfirst"; }
};

然后,GetType(Type)超负荷运转,供你创造的每类产品使用。

This is usually the simplest method (apart, of course, from dynamic_cast). If you REALLY want to get the type of object from virtual call, you could set a static flag denoting last type used, or return it from every function which said object has.

如果你能够写上你真心想“执行特定方法的守则的实际地址”,你的问题肯定会更清楚。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?