Что касается вашего конкретного вопроса,
, как мы можем наблюдать содержимое указателей на функцию-член?
blockquote>Ответ заключается, кроме преобразования их в bool, чтобы выразить, что он указывает на что-то или нет, вы не можете указывать функции-наблюдателя. По крайней мере, не соответствующим образом. Причина в том, что стандарт явно запрещает это:
4.12 примечание 57:
57) Правило для преобразования указателей на членов (от указателя к члену базы до указателя члену производного) представляется инвертированным по сравнению с правилом для указателей на объекты (от указателя к производному до указателя на базу) (4.10, раздел 10). Эта инверсия необходима для обеспечения безопасности типа. Обратите внимание, что указатель на элемент не является указателем на объект или указателем на функцию, а правила для преобразования таких указателей не применяются к указателям на члены. В частности, указатель на член не может быть преобразован в void *.
blockquote>Например, вот пример кода:
#include <cstdlib> #include <vector> #include <algorithm> #include <string> #include <iostream> using namespace std; class Gizmo { public: void DoTheThing() { return; }; private: int foo_; }; int main() { void(Gizmo::*fn)(void) = &Gizmo::DoTheThing; Gizmo g; (g.*fn)(); // once you have the function pointer, you can call the function this way bool b = fn; // void* v = (void*)fn; // standard explicitly disallows this conversion cout << hex << fn; return 0; }
Отмечу, что мой отладчик ( MSVC9) может рассказать мне фактический физический адрес функции-члена во время выполнения, поэтому я знаю, что должен быть какой-то способ получить этот адрес. Но я уверен, что он несоответствует, не переносится и, вероятно, включает машинный код. Если бы я пошел по этой дороге, я бы начал с адреса указателя функции (например,
&fn
), отбрасывая это на пустоту * и оттуда. Это также потребует, чтобы вы знали размер указателей (разные на разных платформах).Но я бы спросил, до тех пор, пока вы можете преобразовать указатель функции-члена в bool и оценить существование указателя, почему в реальном коде вам нужен адрес?
Предположительно, ответ на последний вопрос «так что я могу определить, указывает ли один указатель на функцию на ту же функцию, что и на другой». Справедливо. Вы можете сравнить указатели функций на равенство:
#include <cstdlib> #include <vector> #include <algorithm> #include <string> #include <iostream> using namespace std; class Gizmo { public: void DoTheThing() { return; }; **void DoTheOtherThing() { return; };** private: int foo_; }; int main() { void(Gizmo::*fn)(void) = &Gizmo::DoTheThing; Gizmo g; (g.*fn)(); // once you have the function pointer, you can call the function this way bool b = fn; // void* v = (void*)fn; // standard explicitly disallows this conversion cout << hex << fn; **void(Gizmo::*fnOther)(void) = &Gizmo::DoTheOtherThing; bool same = fnOther == fn; bool sameIsSame = fn == fn;** return 0; }
Попробуйте это:
vector <- 1:100
vector2 <- character(100)
max.length <- 3
for(i in vector){
vector2[i] <- paste(c(rep('0', max.length - nchar(vector[i])),
as.character(vector[i])),
collapse = "")
}
vector2
[1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011" "012" "013"
[14] "014" "015" "016" "017" "018" "019" "020" "021" "022" "023" "024" "025" "026"
[27] "027" "028" "029" "030" "031" "032" "033" "034" "035" "036" "037" "038" "039"
[40] "040" "041" "042" "043" "044" "045" "046" "047" "048" "049" "050" "051" "052"
[53] "053" "054" "055" "056" "057" "058" "059" "060" "061" "062" "063" "064" "065"
[66] "066" "067" "068" "069" "070" "071" "072" "073" "074" "075" "076" "077" "078"
[79] "079" "080" "081" "082" "083" "084" "085" "086" "087" "088" "089" "090" "091"
[92] "092" "093" "094" "095" "096" "097" "098" "099" "100"
Вы можете изменить аргумент max.length, если хотите добавить больше нулей вперед.
Редактировать: я думаю, что ответ Маркуса легче.
Вы можете сгенерировать эту последовательность, используя sprintf
sprintf("%03d", 1:100)
#[1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011" ... "098" "099" "100"