template<typename T>
int Write(T* tmp) {return sizeof(T)} 할 시, tmp가 char[10] 타입이라면, sizeof(T)의 값은 char의 크기인 1일 것이고,
int Write(T& tmp) 라면 char[10] 크기 그 자체인 10이 된다. 배열이 함수의 매개변수로 입력되면 char[] -> char* 타입으로 캐스팅 되기 때문에 그런 것으로 보인다.
template<typename T>
bool Write(T& src) { return Write(reinterpret_cast<void*>(&src), sizeof(T)); }
bool Write(void* src, uint32 len);
실제로 오늘 구현한 클래스 내부중 이러한 내용이 들어갔었는데, 처음에는
template<typename t>
bool Write(T* src) { return Write(src, sizeof(T)); }
bool Write(void* src, uint32 len);
이렇게 구현하였다가 sizeof(T)에 자꾸 1이 들어가길래 살펴보니 char타입의 크기였다.
또한
template<typename T>
inline BufferWriter& BufferWriter::operator<<(T&& src) {
using DataType = std::remove_reference_t<T>;
*reinterpret_cast<DataType*>(&_buffer[_pos]) = std::forward<DataType>(src);
_pos += sizeof(T);
return *this;
}
'abstract declarator': 참조에 대한 포인터를 만들 수 없습니다.
라는 에러가 뜨는데,
이 부분도 값을 BufferWriter란 함수내부에 buffer에 값을 복사하기 위해서 보편 참조형식으로 구현하였는데,
using DataType = std::remove_reference_t; 이 부분이 없이 그냥 *reinterpret_cast<T*>(&_buffer[_pos]) = std::forward<T>(src); 로 구현하면 일반참조가 T타입이라면 예를 들어서 const int& 타입이 T라면 *reinterpret_cast<const int&*> 타입이 되는건데, 참조의 포인터는 존재하지 않기 때문에 에러가 발생함. 그래서 레퍼런스를 삭제해주는 remove_reference_t로 참조를 제거하여서 사용하였다.
또한 UTF-16을 사용하기 위해서 wstring을 사용하였고, 멀티스레드 환경에서 에러사항이 있었는데,
wcout.imbue(std::locale("kor"));
이 코드가 멀티스레드에서 실행되다보니 locale의 소멸자가 이중으로 발생하는 경우가 발생하였는데,
static const std::locale koreanLoc("kor"); // new, delete 꼬임 방지
wcout.imbue(koreanLoc);
//wcout.imbue(std::locale("kor")); static으로 선언하여 해결하였다.
'c++' 카테고리의 다른 글
공부 (0) | 2025.05.06 |
---|---|
c++ 공부(algorithm) (0) | 2025.03.08 |
c++공부(list iterator 구현) (0) | 2025.03.07 |
c++ 공부(vector iterator 구현) (0) | 2025.03.06 |
c++ 공부 (1) | 2025.03.03 |