여기 내 코드입니다 (표준 : : 문자열) 새로운 내부 배치를 가지고 클래스에 대한 안전 복사 생성자를 구현 : 사례를 적절하게 처리하는 복사 생성자를 추가하는 방법에 대한어떻게
struct RS_Token
{
char id;
char cleanup;
unsigned char array[sizeof (std::string) > sizeof (double) ? sizeof (std::string) : sizeof (double)];
RS_Token(int a) :
id(a),
cleanup(0)
{
}
RS_Token(int a, const char* pstr) : // identifier or text
id(a),
cleanup(1)
{
new (array) std::basic_string<unsigned char>((unsigned char*)pstr);
}
RS_Token(int a, int b) : // integer
id(a),
cleanup(0)
{
new (array) int(b);
}
RS_Token(int a, double b) : // float (double)
id(a),
cleanup(0)
{
new (array) double(b);
}
~RS_Token()
{
if (cleanup)
{
std::basic_string<unsigned char>* p = reinterpret_cast<std::basic_string<unsigned char>*>(array);
p->~basic_string();
}
}
};
어떤 제안 어디 std :: string 내부적으로 할당되었습니다, 감사하겠습니다.
별도의'표준 : string'와'double' 변수를 만드는 잘못 무엇입니까? 당신이 가지고있는 코드는 다른 것들 중에서 [심각한 정렬 문제] (http://www.gotw.ca/gotw/028.htm)를 가지게 될 것입니다. 그리고 그것들을 별도의 멤버 변수로 만들면 컴파일러에서 생성 한 복사본 생성자가 올바른 일을합니다. –
Placement-new는 일반적으로'void *'인수를 취하므로 지루한 캐스트를 스스로 해결할 수 있습니다. –
아마도 boost :: variant'이 이러한 일을 처리 할 것입니다. –
visitor