Это - способ, которым это! Я рассматриваю его как один из тех маленьких дефектов в Python!
я не думаю, что существует серьезное основание для него, но это определенно не анализирует; действительно легко проанализировать необработанные строки с \как последний знак.
выгода, если Вы позволите \быть последним знаком в необработанной строке тогда, то Вы не будете в состоянии поместить "в необработанной строке. Кажется, что Python пошел с разрешением" вместо того, чтобы позволить \как последний знак.
Однако это не должно доставлять неприятности.
, Если Вы волнуетесь по поводу неспособности легко записать пути папки окон такой как c:\mypath\
тогда беспокойство не, поскольку, можно представить их как r"C:\mypath"
, и, если необходимо добавить имя подкаталога, не делайте этого с конкатенацией строк, поскольку это не правильный способ сделать это так или иначе! используйте os.path.join
>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\\mypath\\subfolder'
Все объекты 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;
}