(R) Мой цикл for для добавления текста в строковое значение не работает

Что касается вашего конкретного вопроса,

, как мы можем наблюдать содержимое указателей на функцию-член?

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

4.12 примечание 57:

57) Правило для преобразования указателей на членов (от указателя к члену базы до указателя члену производного) представляется инвертированным по сравнению с правилом для указателей на объекты (от указателя к производному до указателя на базу) (4.10, раздел 10). Эта инверсия необходима для обеспечения безопасности типа. Обратите внимание, что указатель на элемент не является указателем на объект или указателем на функцию, а правила для преобразования таких указателей не применяются к указателям на члены. В частности, указатель на член не может быть преобразован в void *.

Например, вот пример кода:

#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;
}
0
задан nicola 18 January 2019 в 13:21
поделиться

2 ответа

Попробуйте это:

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, если хотите добавить больше нулей вперед.

Редактировать: я думаю, что ответ Маркуса легче.

0
ответ дан Fernando 18 January 2019 в 13:21
поделиться

Вы можете сгенерировать эту последовательность, используя sprintf

sprintf("%03d", 1:100)
#[1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011" ... "098" "099" "100"
0
ответ дан markus 18 January 2019 в 13:21
поделиться
Другие вопросы по тегам:

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