더북(TheBook)
void WriteBytes(const void* inData, size_t inByteCount)
    { WriteBits(inData, inByteCount << 3); }
 
void Write(uint32_t inData, size_t inBitCount = sizeof(uint32_t) * 8)
    { WriteBits(&inData, inBitCount); }
void Write(int inData, size_t inBitCount = sizeof(int) * 8)
    { WriteBits(&inData, inBitCount); }
void Write(float inData)
    { WriteBits(&inData, sizeof(float) * 8); }
void Write(uint16_t inData, size_t inBitCount = sizeof(uint16_t) * 8)
    { WriteBits(&inData, inBitCount); }
void Write(int16_t inData, size_t inBitCount = sizeof(int16_t) * 8)
    { WriteBits(&inData, inBitCount); }
void Write(uint8_t inData, size_t inBitCount = sizeof(uint8_t) * 8)
    { WriteBits(&inData, inBitCount); }
void Write(bool inData)
    { WriteBits(&inData, 1); }

이렇게 구현하면 대부분 원시 자료형은 그냥 Write()에 넘기기만 하면 된다. 자료형에 맞게 비트 수가 디폴트 매개변수로 선택될 것이다. 적은 수의 비트를 쓰려면 이 매개변수에 비트 수를 명시적으로 지정하면 된다. 나아가 여러 개의 오버로드 대신, 자료형 특성 정보를 이용한 템플릿으로 구현하면 더욱 일반화할 수 있다.

template<typename T>
void Write(T inData, size_t inBitCount = sizeof(T) * 8)
{
    // 원시 자료형인지 여부를 컴파일 타임에 검사
    static_assert(
        std::is_arithmetic<T>::value ||
        std::is_enum<T>::value,
        “Generic Write only supports primitive data types”);
 
    WriteBits(&inData, inBitCount);
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.