假设有人给我实现了打印功能来打印键的值。这里给定了两个键,分别是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;
}
答案 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 *
)。