C++ 获取Void*C+的值+;

C++ 获取Void*C+的值+;,c++,void-pointers,C++,Void Pointers,我有一个void指针,我想得到指针所指内容 void class :: method(void * pointer) { cout<<pointer; // The address which the pointer refers to. cout<<?; //The content of where the pointer refers to. } void类::方法(void*指针) { cout您需要将void*强制转换回其原始类型(即强制

我有一个
void
指针,我想得到指针所指内容

void class :: method(void * pointer)
{
     cout<<pointer; // The address which the pointer refers to.
     cout<<?; //The content of where the pointer refers to.
}  
void类::方法(void*指针)
{

cout您需要将
void*
强制转换回其原始类型(即强制转换为
void*
之前)。然后您可以取消引用指针并使用它所指向的内容

例如:


但这可能会变得非常冗长,具体取决于您希望支持的类型数量。

您需要将
void*
强制转换回其原始类型(即,在将其强制转换为
void*
之前)。然后您可以取消引用指针并使用它所指向的内容

例如:


但是这可以很冗长,取决于你想支持的类型。

这是不可能的。C++中的类型(大部分)是编译时属性。在运行时,类型是未知的(它们是.< /p>)。 但是,存在虚拟方法,特别是对于一些包含虚拟方法的
类的实例

一般来说,没有可能的诀窍。您可以通过某种方式重新设计程序,或者通过拥有一个所有对象都从中继承的公共根类,等等,或者通过使用(最好拥有自己的有区别的联合)

换句话说:当编译器看到
void*
指针时,它甚至不知道该指针所指向的数据的大小

未来C++标准可能会提出一些容器。

也许你可以有一个廉价的歧视工会阶级,比如

class Int_or_String {
   const bool isint;
   union {
     int n;
     std::string s;
   };
   Int_or_String(const int i) : isint(true), n(i) {};
   Int_or_String(const std::string &st): isint(false), s(st) {};
   ~Int_or_String() { if (isint) n=0; else 
     /*not sure*/ s.std::string::~std::string(); };
   // much more is missing
};
我甚至不确定明确销毁工会成员的语法

请参见,例如,关于显式调用析构函数

也许这本书会给你带来灵感,也可以看看它的优点

通常的方法是在程序中定义一个根类,并采用所有对象都继承该根类(甚至所有有意义的数据都在从该根类派生的对象中)的约定。这需要对整个过程进行重新设计

因此,您可以确定您的根类是

class Root {
public:
  virtual void out(std::ostream&s) =0;
  virtual ~Root() =0;
  /// other common methods
};

static inline std::ostream& operator << (std::ostream&o, const Root &r)
   { r.out(o); return o; }


class Integer : public Root {
   const int num;
 public:
   Integer(int n) : Root(), num(n) {};
   void out (std::ostream &o) { o << num ; }; 
   /// etc...
 }; // end class Num


class String : public Root {
   const std::string str;
 public:
   String(const std::string& s) : Root(), str(s) {};
   void out (std::ostream &o) { o << str ; }; 
   /// etc...
 }; // end class String
类根目录{
公众:
虚空输出(std::ostream&s)=0;
virtual~Root()=0;
///其他常用方法
};

静态内联STD::OFSUCTORANS < P>这是不可能的。C++中的类型(大部分)是编译时属性。在运行时,类型是未知的(它们是.< /P>)。 但是,存在虚拟方法,特别是对于一些包含虚拟方法的
类的实例

一般来说,没有可能的诀窍。您可以通过某种方式重新设计程序,或者通过拥有一个所有对象都从中继承的公共根类,等等,或者通过使用(最好拥有自己的有区别的联合)

换句话说:当编译器看到
void*
指针时,它甚至不知道该指针所指向的数据的大小

未来C++标准可能会提出一些容器。

也许你可以有一个廉价的歧视工会阶级,比如

class Int_or_String {
   const bool isint;
   union {
     int n;
     std::string s;
   };
   Int_or_String(const int i) : isint(true), n(i) {};
   Int_or_String(const std::string &st): isint(false), s(st) {};
   ~Int_or_String() { if (isint) n=0; else 
     /*not sure*/ s.std::string::~std::string(); };
   // much more is missing
};
我甚至不确定明确销毁工会成员的语法

请参见,例如,关于显式调用析构函数

也许这本书会给你带来灵感,也可以看看它的优点

通常的方法是在程序中定义一个根类,并采用所有对象都继承该根类(甚至所有有意义的数据都在从该根类派生的对象中)的约定。这需要对整个过程进行重新设计

因此,您可以确定您的根类是

class Root {
public:
  virtual void out(std::ostream&s) =0;
  virtual ~Root() =0;
  /// other common methods
};

static inline std::ostream& operator << (std::ostream&o, const Root &r)
   { r.out(o); return o; }


class Integer : public Root {
   const int num;
 public:
   Integer(int n) : Root(), num(n) {};
   void out (std::ostream &o) { o << num ; }; 
   /// etc...
 }; // end class Num


class String : public Root {
   const std::string str;
 public:
   String(const std::string& s) : Root(), str(s) {};
   void out (std::ostream &o) { o << str ; }; 
   /// etc...
 }; // end class String
类根目录{
公众:
虚空输出(std::ostream&s)=0;
virtual~Root()=0;
///其他常用方法
};


静态内联std::ostream&operator谢谢。如果我不知道原始类型是什么并且不能使用模板?@yaelaviv:那么重新设计你的程序,这样你就可以找到原始类型,或者一开始就不转换为
void*
。根本无法确定
void*
指向什么。@yaelaviv:那么你就有问题了lem.如果你不知道
void*
指针的原始类型,你就不能安全地取消对它的引用。@Sanderedycker,如果我知道指针是字符串或整数,有什么解决办法吗?@yaelaviv:你需要知道确切的类型,而不是模糊的描述。如果你用一点关于你要做什么的背景信息更新你的问题如果要实现这一点,我们可能会更好地帮助您。谢谢。如果我不知道原始类型是什么,并且无法使用模板?@yaelaviv:那么重新设计您的程序,以便您可以找到原始类型,或者首先不要转换为
void*
。根本无法确定
void*
指向什么。@yaelaviv:那你就有问题了。如果你不知道它的原始类型,你就不能安全地取消引用
void*
指针。@Sanderedycker,如果我知道指针是字符串或整数,有什么解决办法吗?@yaelaviv:你需要知道确切的类型,而不是模糊的描述。如果你用w上的一些背景信息更新你的问题您正试图实现的目标,我们可能会更好地帮助您。@BasileStarykevitch,有什么诀窍吗?我不能强制将内容转换为任何类型吗?该方法确实是虚拟的,您能举个例子吗?@BasileStarykevitch,谢谢,如果我知道指针是字符串或ineger,有解决方案吗?@BasileStarykevitch,有什么把戏吗?我不能强迫内容转换成任何类型吗?这个方法确实是虚拟的,你能举个例子吗?@basiletarykevitch,谢谢,如果我知道指针是字符串或Inger,有解决办法吗?我怀疑你滥用了
void*
@basiletarynkevich,我想允许向这个方法发送每种类型,并对每种类型执行相同的操作。限制:该方法是虚拟的,因此我不能使用模板方法。有什么想法吗?@johndilling,LOL!我想允许发送到每种类型的方法,并对每种类型执行相同的操作。限制:该方法是虚拟的,因此我不能使用模板方法。有什么想法吗?谢谢