如果数据类型未知,如何打印void指针的值?

时间:2018-10-13 07:16:25

标签: c++ pointers

假设有人给我实现了打印功能来打印键的值。这里给定了两个键,分别是key和key1。如果我知道由void指针指向的数据类型,我可以按照以下方式打印。 strong>但是,如果我不知道数据类型,我将如何打印?

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 :(得分:1)

  

但是,如果我不知道数据类型,我将如何打印?

仅从void*中恢复数据类型是不可能的。您将不得不寻找另一种方法。

答案 1 :(得分:0)

您有一个map,密钥为std::string,并且可能有多种可打印类型。

因此,您可以在此处使用多态,不要使用void *,例如,创建一个称为Printable的接口(C ++中的接口是具有抽象方法的普通类/结构),然后将其映射为该映射>或map>或map>,甚至将字符串映射到Printable的原始指针(不建议)。使您的类具有虚拟的printableString函数,然后使之成为朋友运算符<<函数以ostream到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;
}

答案 2 :(得分:0)

  

但是,如果我不知道数据类型,我将如何打印?

void *是不透明的类型。您必须以某种方式知道其背后的实际类型。否则,您将无法取消引用它。

例如,您可以将信息携带在enum变量中,并携带该变量的类型,然后根据该变量运行不同的打印代码。


或者,如果至少知道void *后面的对象大小,则可以打印原始字节(广播到char *)。