Ich habe einen Code, der std::to_string()
ist eine Variable, deren Typ ein Vorlagenparameter ist. Angenommen, der Code ist:Machen std :: to_string Arbeit mit Void-Zeiger likes Operator <<?
template <typename T>
std::string foo(const T& t) {
return std::string("I got ") + std::to_string(t);
}
Nun, manchmal muss dieser Parameter ein void *
sein; und ich möchte die Adresse in der Zeichenfolge erhalten, z. "I got 0xdeadbeef"
. Kein Problem, oder? Ich sollte es genauso bekommen, als hätte ich std::cout << my_ptr
, oder? ... Leider ist das nicht der Fall. Nun,
- Ist es "legitim" für mich, den oben genannten Code zu verwenden, wie ich beschrieben habe?
- Anders als in
foo()
auf der Verwendung eines Stroms beharren, gibt es etwas, als es besser zu machenvoid*
‚s zu überlastenstd::to_string
für (einestd::stringstream
dort für dieoperator<<
verwenden)?
Das void * ist keine Zeichenkette, ich kann es nicht als Zeichenkette ausgeben (ich würde eine Art 'as_hex()' Funktion brauchen, oder einen Stringstream benutzen); aber Ihr Vorschlag ist anders als das interessant. +1. – einpoklum
Der 'reininterpret_cast' ist fast sicher falsch, und das wäre UB. – Barry
@Barry wie? Wenn 'void * ptr' eine Null-terminierte Zeichenfolge enthält, ist es OK, in anderen Fällen wird UB sogar mit' char * ptr' und ohne Casting sein. – LibertyPaul