C ++ : 템플릿을 사용하여 유형과 기능이 다른 반복 코드 축소

레나

Lua가 메모리 블록에서 임의의 바이트를 다른 유형과 바이트 순서로 읽고 쓸 수 있도록하는 라이브러리를 작성하고 있습니다. 어느 정도 반복을 피하기 위해 C ++ 템플릿을 사용했지만 완전히 피할 수는 없었습니다.

/* Read one or more sequential values from the blob and push to the Lua stack
 * using lua_pushinteger().
 * Lua: the Lua state to push to.
 * offset: The byte offset to read from.
 * count: The number of values to read.
 * This method is called from Blob::read() which is called from Lua methods.
 * For offsets outside the valid range, it returns nil.
 */
template <typename T>
lua_Integer Blob::readi(lua_State *Lua, lua_Integer offset, lua_Integer count) {
    if(offset < 0) offset += this->size;
    else offset--; //make 0-based

    for(int i=0; i<count; i++) {
        if(offset >= 0 && offset < this->size) {
            T value = *(&this->data[offset + this->pageOffset]);
            lua_pushinteger(Lua, value);
            offset += sizeof(T);
        }
        else lua_pushnil(Lua);
    }
    return count;
}

/* Same as readi but uses lua_pushnumber
 * even with templates we end up duplicating logic :|
 */
template <typename T>
lua_Integer Blob::readf(lua_State *Lua, lua_Integer offset, lua_Integer count) {
    if(offset < 0) offset += this->size;
    else offset--; //make 0-based

    for(int i=0; i<count; i++) {
        if(offset >= 0 && offset < this->size) {
            T value = *(&this->data[offset + this->pageOffset]);
            lua_pushnumber(Lua, value);
            offset += sizeof(T);
        }
        else lua_pushnil(Lua);
    }
    return count;
}

float또는 double을 읽으려면 lua_pushnumber(lua_State *Lua, lua_Number num)대신 을 사용해야 합니다 lua_pushinteger(lua_State *Lua, lua_Integer num). (일반적으로 lua_Integer다음과 같은 몇 가지 중요한 유형의 형식 정의입니다 int32_t, 그리고 lua_Number의 형식 정의입니다 double.) 나도 몰라 그래서 난 이후, 템플릿을 사용하여이 기능을 중복되지 않도록 할 수있는 방법 lua_pushintegerlua_pushnumber다른 유형에 동의합니다.

또한 바이트 순서 지정 (의 함수 사용)에 대한 지원을 추가하고 싶습니다 endian.h. 읽는 값이 빅 엔디안 순서, 리틀 엔디안 또는 네이티브 (호스트 머신이 무엇이든간에)로 가정하도록 지정할 수 있습니다. 다시 말하지만, 바이트 순서 함수는 다른 유형을 다루기 때문에 템플릿으로이를 달성하는 방법을 모릅니다.

야크-아담 네 브라우 몽
void lua_push_anything( lua_State* s, lua_Integer i ) {
  lua_push_integer( s, i );
}
void lua_push_anything( lua_State* s, lua_Number i ) {
  lua_push_number( s, i );
}
void lua_push_anything( lua_State* s, bool b ) {
  lua_push_boolean( s, b ); // actually takes an `int`.
}
void lua_push_anything( lua_State* s, std::string s ) {
  lua_pushlstring( lua_State* s, s.c_str(), s.size() );
}

이렇게하면 유형 문제가 해결 extern "C" lua_*됩니다. 올바른 함수로 전달되는 단일 재정의가 있습니다.

필요한 경우 비슷한 방식으로 엔디안을 처리 할 수 ​​있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

코드 복사를 방지하기 위해 스트림에 템플릿을 사용하면 "오류 C4430 : 유형 지정자 누락-int 가정"이 생성됩니다.

분류에서Dev

C ++ : 템플릿을 사용하여 반환 유형을 오버로드하는 방법은 무엇입니까?

분류에서Dev

auto를 사용하지 않고 템플릿의 반복기에서 변수 유형을 추론합니다.

분류에서Dev

C ++ 데코레이터 패턴, 템플릿을 사용한 정적 다형성 및 콜백 메서드 등록

분류에서Dev

C ++에서 템플릿없이 템플릿과 유사한 코드 구성

분류에서Dev

다른 유형을 사용하여 과부하 기능

분류에서Dev

템플릿 인수를 기반으로 유형을 반환하는 C ++ 템플릿 함수

분류에서Dev

템플릿 인수 유형 조건에 따라 다른 튜플 유형을 반환하는 템플릿 함수 만들기

분류에서Dev

템플릿 변수가없는 템플릿 유형 및 이러한 유형을 사용하는 다른 템플릿 유형

분류에서Dev

링크 된 목록에 대한 노드 유형과 데이터 유형을 모두 전달하려면 템플릿 매개 변수를 사용합니다.

분류에서Dev

C ++ 템플릿을 사용하여 타사 C 코드 래핑

분류에서Dev

다른 페이지 템플릿에서 게시물 제목을 클릭하여 특정 사용자 지정 워드 프레스 템플릿에서 사용자 지정 게시물 유형을 엽니 다.

분류에서Dev

C ++ : 한 번 사용한 후 템플릿의 일반 데이터 유형을 다시 선언하는 이유는 무엇입니까?

분류에서Dev

C ++ 템플릿은 요소 유형을 두 번 전달하지 않습니다.

분류에서Dev

템플릿 매개 변수를 기반으로 서로 다른 네임 스페이스에서 유사한 기능을 선택하는 방법

분류에서Dev

C ++ 11 : 반환 유형이 다른 두 가지 템플릿 함수를 작성하는 방법

분류에서Dev

C ++ 17의 구조화 된 바인딩과 같이 C ++ 11에서 맵을 반복하는 템플릿을 만듭니다.

분류에서Dev

C # 코드를 사용하여 XSLT의 템플릿 이름 읽기

분류에서Dev

C ++ 템플릿 전문화 동반자 반복기 오류 : 불완전한 유형의 잘못된 사용

분류에서Dev

Typescript는 레코드 유형을 반복하고 업데이트 된 레코드를 반환합니다.

분류에서Dev

스위치를 사용하여 다른 개체 유형을 만들 때 코드 중복을 최소화하는 방법

분류에서Dev

반복기 및 템플릿과 함께 C ++에서 std :: sort 사용

분류에서Dev

유니 코드 값없이 템플릿의 뷰에서 반복 가능한 JSON 가져 오기

분류에서Dev

템플릿을 사용하여 데이터를 적응 형 카드 선택 세트 템플릿에 바인딩

분류에서Dev

C ++ 클래스 템플릿 복사 생성자 반환 유형

분류에서Dev

원시 데이터 유형을 C ++ 템플릿으로 사용하는 Java 템플릿

분류에서Dev

단계에서 다른 템플릿을 사용하는 다중 단계 파이프 라인을위한 분기 기반 조건부 빌드

분류에서Dev

List <list <string >>을 소스로 사용하고 그리드를 데이터 템플릿으로 사용하여 목록보기를 생성합니다.

분류에서Dev

오류 C2893 : CTPL을 사용하여 기능 템플릿을 전문화하지 못했습니다.

Related 관련 기사

  1. 1

    코드 복사를 방지하기 위해 스트림에 템플릿을 사용하면 "오류 C4430 : 유형 지정자 누락-int 가정"이 생성됩니다.

  2. 2

    C ++ : 템플릿을 사용하여 반환 유형을 오버로드하는 방법은 무엇입니까?

  3. 3

    auto를 사용하지 않고 템플릿의 반복기에서 변수 유형을 추론합니다.

  4. 4

    C ++ 데코레이터 패턴, 템플릿을 사용한 정적 다형성 및 콜백 메서드 등록

  5. 5

    C ++에서 템플릿없이 템플릿과 유사한 코드 구성

  6. 6

    다른 유형을 사용하여 과부하 기능

  7. 7

    템플릿 인수를 기반으로 유형을 반환하는 C ++ 템플릿 함수

  8. 8

    템플릿 인수 유형 조건에 따라 다른 튜플 유형을 반환하는 템플릿 함수 만들기

  9. 9

    템플릿 변수가없는 템플릿 유형 및 이러한 유형을 사용하는 다른 템플릿 유형

  10. 10

    링크 된 목록에 대한 노드 유형과 데이터 유형을 모두 전달하려면 템플릿 매개 변수를 사용합니다.

  11. 11

    C ++ 템플릿을 사용하여 타사 C 코드 래핑

  12. 12

    다른 페이지 템플릿에서 게시물 제목을 클릭하여 특정 사용자 지정 워드 프레스 템플릿에서 사용자 지정 게시물 유형을 엽니 다.

  13. 13

    C ++ : 한 번 사용한 후 템플릿의 일반 데이터 유형을 다시 선언하는 이유는 무엇입니까?

  14. 14

    C ++ 템플릿은 요소 유형을 두 번 전달하지 않습니다.

  15. 15

    템플릿 매개 변수를 기반으로 서로 다른 네임 스페이스에서 유사한 기능을 선택하는 방법

  16. 16

    C ++ 11 : 반환 유형이 다른 두 가지 템플릿 함수를 작성하는 방법

  17. 17

    C ++ 17의 구조화 된 바인딩과 같이 C ++ 11에서 맵을 반복하는 템플릿을 만듭니다.

  18. 18

    C # 코드를 사용하여 XSLT의 템플릿 이름 읽기

  19. 19

    C ++ 템플릿 전문화 동반자 반복기 오류 : 불완전한 유형의 잘못된 사용

  20. 20

    Typescript는 레코드 유형을 반복하고 업데이트 된 레코드를 반환합니다.

  21. 21

    스위치를 사용하여 다른 개체 유형을 만들 때 코드 중복을 최소화하는 방법

  22. 22

    반복기 및 템플릿과 함께 C ++에서 std :: sort 사용

  23. 23

    유니 코드 값없이 템플릿의 뷰에서 반복 가능한 JSON 가져 오기

  24. 24

    템플릿을 사용하여 데이터를 적응 형 카드 선택 세트 템플릿에 바인딩

  25. 25

    C ++ 클래스 템플릿 복사 생성자 반환 유형

  26. 26

    원시 데이터 유형을 C ++ 템플릿으로 사용하는 Java 템플릿

  27. 27

    단계에서 다른 템플릿을 사용하는 다중 단계 파이프 라인을위한 분기 기반 조건부 빌드

  28. 28

    List <list <string >>을 소스로 사용하고 그리드를 데이터 템플릿으로 사용하여 목록보기를 생성합니다.

  29. 29

    오류 C2893 : CTPL을 사용하여 기능 템플릿을 전문화하지 못했습니다.

뜨겁다태그

보관