Как хешировать и сравнить pointer-to-member-function?

Это - способ, которым это! Я рассматриваю его как один из тех маленьких дефектов в Python!

я не думаю, что существует серьезное основание для него, но это определенно не анализирует; действительно легко проанализировать необработанные строки с \как последний знак.

выгода, если Вы позволите \быть последним знаком в необработанной строке тогда, то Вы не будете в состоянии поместить "в необработанной строке. Кажется, что Python пошел с разрешением" вместо того, чтобы позволить \как последний знак.

Однако это не должно доставлять неприятности.

, Если Вы волнуетесь по поводу неспособности легко записать пути папки окон такой как c:\mypath\ тогда беспокойство не, поскольку, можно представить их как r"C:\mypath", и, если необходимо добавить имя подкаталога, не делайте этого с конкатенацией строк, поскольку это не правильный способ сделать это так или иначе! используйте os.path.join

>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\\mypath\\subfolder'
7
задан AllDayCpp 25 August 2009 в 13:33
поделиться

1 ответ

Все объекты C ++, включая указатели на функции-члены, представлены в памяти как массив символов. Итак, вы можете попробовать:

bool (Class::*fn_ptr)() = &Class::whatever;
const char *ptrptr = static_cast<const char*>(static_cast<const void*>(&fn_ptr));

Теперь обработайте ptrptr как указывающий на массив из (sizeof (bool (Class :: *) ())) байтов, и сравните их с хешем. байты. Вы можете использовать unsigned char вместо char , если хотите.

Это гарантирует отсутствие ложных срабатываний - в C ++ 03 указатели на функции-члены являются POD, что означает среди прочего вещи, которые можно скопировать с помощью memcpy. Это означает, что если у них одинаковые побайтовые значения, они будут одинаковыми.

Проблема в том, что представление хранилища указателей функций-членов может включать биты, которые не участвуют в значении, поэтому они не обязательно будут быть одинаковыми для разных указателей на одну и ту же функцию-член. Или компилятор может по какой-то непонятной причине иметь более одного способа указать на одну и ту же функцию одного и того же класса, которые побайтно не равны. В любом случае вы можете получить ложноотрицательные результаты. Вам нужно будет посмотреть, как указатели на функции-члены действительно работают в вашей реализации. Он должен каким-то образом реализовать operator == для указателей на функции-члены, и если вы можете узнать, как, то вы, вероятно, сможете определить порядок и хэш-функцию.

Это потенциально сложно: указатели на функции-члены неудобны , и хранилище, вероятно, будет включать разное количество неучаствующего «свободного пространства» в зависимости от того, на какую функцию указывает (виртуальная, наследуемая). Так что вам, вероятно, придется довольно значительно взаимодействовать с деталями реализации вашего компилятора. Эта статья может помочь вам начать: http://www.codeproject.com/KB/cpp/FastDelegate.aspx

Более чистой альтернативой может быть выполнение линейного поиска по массиву, чтобы «канонизировать» все указатели функций, затем сравнить и хэш, основанный на позиции "канонического" экземпляра указателя на функцию в вашем массиве. Зависит от ваших требований к производительности. И даже если есть требования, имеет ли класс (и его производные классы) столько функций, что линейный поиск займет столько времени?

typedef bool (Class::*func)();
vector<func> canon;

size_t getIndexOf(func fn_ptr) {
    vector<func>::iterator it = find(canon.begin(), canon.end(), fn_ptr);
    if (it != canon.end()) return it - canon.begin();
    canon.push_back(func);
    return canon.size() - 1;
}
13
ответ дан 6 December 2019 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: