Как вывести значения пустого указателя, если типы данных неизвестны? - PullRequest
0 голосов
/ 13 октября 2018

Предположим, кто-то дал мне Реализовать функцию печати для печати значения ключей. Здесь в параметре в качестве ключа и ключа даны два ключа. Если я знаю тип данных, указывающий на пустой указатель, я могу напечатать следующим образом. Но если я не знаю тип данных, как я буду печатать?

void Print(map<string , void*>&mp,string key,string key1) {
    auto res =mp[key];
    auto res1 =mp[key1];
    cout<<*(string*)res<<endl;
    cout<<*(int*)res1<<endl;

}

Для пояснения основная функция приведена ниже.

int main(){
    map<string , void*>mp;
    string *val = new string("val");
    mp["key"]=val;
    int *value = new int(5);
    mp["key1"]=value;
    Print(mp,"key","key1");
   return 0;
}

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Но если я не знаю тип данных, как я буду печатать?

Невозможно восстановить типы данных только из void*.Вам придется найти другой путь.

0 голосов
/ 13 октября 2018

Но если я не знаю тип данных, как я буду печатать?

void * - непрозрачный тип.Вы должны как-то знать фактический тип этого.В противном случае вы не можете разыменовать его.

Например, вы можете перенести информацию в переменную enum, указывающую, к какому типу она относится, а затем запустить другой код печати в зависимости от этого.


В качестве альтернативы, если вы хотя бы знаете размер объекта за void *, вы можете напечатать необработанные байты (приведение к char *).

0 голосов
/ 13 октября 2018

У вас есть map с ключом std::string и, возможно, несколькими типами для печати. ​​

Таким образом, вы можете использовать полиморфизм здесь, не используйте void *, создайте интерфейс (Интерфейс в C ++является нормальным классом / структурой с абстрактными методами), называемым Printable, например, затем создайте карту как эту карту> или map> или map>, или даже сопоставьте строку с необработанным указателем Printable (не рекомендуется).Сделайте так, чтобы у вашего класса была виртуальная функция printableString, затем сделайте оператор дружественной функции << в ostream, где вы можете <code>cout << printableString()

Пример:

#include <iostream>
#include <memory>
#include <map>
using namespace std;

class Printable {
public:
    virtual std::string printableString() const = 0;
    friend ostream &operator << (ostream &stream, const Printable &printable) {
        return stream << printable.printableString();
    }
};

class PrintableString: public Printable {
private:
    std::string string;
public:
    PrintableString(std::string string): string(string) {}
    virtual std::string printableString() const {
        return string;
    }
};

map<std::string, std::shared_ptr<Printable>> ptr;
int main() {
    ptr["Aaaa"] = std::make_shared<PrintableString>("B");
    cout << *(ptr["Aaaa"]);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...