char 포인터 및 문자열 리터럴 오버로드

마이크로 코드

char 포인터에서 문자열 리터럴을 허용하고 명확하게 할 수있는 클래스를 만들려고합니다. 이 문제를 검색 할 때 제공된 솔루션은 char 포인터 만 허용하는 '홀더'클래스를 만드는 것입니다.

template< typename char_t >
class String
{
    struct holder_t
    {
        const char_t* s;
        holder_t( const char_t* s ) : s(s) {}
        holder_t( char_t* s ) : s(s) {}
    };
public:

    // Construct from string literal
    template< size_t S >
    String( const char_t (&str)[S] )
    {
        std::cout << "String Literal: " << str;
    }

    // Construct from char pointer
    String( holder_t h )
    {
        std::cout << "Char Pointer: " << h.s;
    }
};

큰 아이디어는이 클래스의 인스턴스를 명시 적으로 만들 필요가 없으며 암시 적 변환에 의해 발생해야한다는 것입니다.

void StringFoo( String<char> s )
{
}

그러나 이로 인해 char 포인터에 대한 컴파일 오류가 발생하는데 왜 암시 적 변환이 작동하지 않습니까?

int main()
{
    // Works!
    StringFoo( "literal" );

    // error C2664: 'StringFoo' : cannot convert parameter 1 from 'const char *' to 'String<char_t>'
    // with [ char_t=char ]
    // No constructor could take the source type, or constructor overload resolution was ambiguous
    StringFoo( (const char*)"const char ptr" );

    // Works!
    StringFoo( String<char>((const char*)"const char ptr") );

    // error C2664: 'StringFoo' : cannot convert parameter 1 from 'char *' to 'String<char_t>'
    // with [ char_t=char ]
    // No constructor could take the source type, or constructor overload resolution was ambiguous
    StringFoo( (char*)"char ptr" );

    // Works!
    StringFoo( String<char>((char*)"const char ptr") );

    return 0;
}

이것은 단순한 무의미한 예일뿐입니다. 내 실제 코드에서 문자열의 해시를 저장할 클래스를 만들었습니다.

문자열 리터럴이 전달되면 컴파일 타임에 해시가 생성되고 char 포인터가 전달되면 런타임에 계산됩니다.

그러나 이것은 문자열을 전달하는 사용자에게 완전히 투명해야하며 해싱은 자동으로 수행됩니다.

Dietmar Kühl

코드가 포인터와 함께 작동하지 않는 이유는 두 가지 버전 ( char const*to holderholderto) 이 필요 하기 때문 String입니다. 그러나 암시 적 변환은 최대 한 번의 변환을 수행합니다.

목적을 위해 당신은 당신이 합리적으로 단지를 구별 할 수 있다고 생각이라고 묘사 char const(&)[N]하고 char const*항상 어쨌든 해시를 계산하고 싶은 단지가되어 있는지 확인 이후 : constexpr가능한 경우, 복용 버전 만드는 char const(&)[N]트릭을해야 참조.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

char 포인터 및 문자열 리터럴 오버로드

분류에서Dev

문자열 리터럴 대 const char * 함수 오버로드

분류에서Dev

문자열 리터럴 상수를 char const * 및 wchar const *로 한 번 정의

분류에서Dev

char 포인터가 항상 동일한 문자열 리터럴을 가리키는 지 확인하십시오.

분류에서Dev

Char 문자열 및 포인터에 대한 C ++ 질문

분류에서Dev

문자열 리터럴에서 문자 배열 리터럴로

분류에서Dev

문자열 및 리터럴 추가 (C ++)

분류에서Dev

문자열 및 리터럴 추가 (C ++)

분류에서Dev

기본 다국어 평면 외부의 문자 리터럴 코드 포인트로 char16_t 할당

분류에서Dev

기본 다국어 평면 외부의 문자 리터럴 코드 포인트로 char16_t 할당

분류에서Dev

메서드 호출에서 문자열 리터럴이있는 C ++ const char *

분류에서Dev

char 배열을 문자 포인터 배열로 복사

분류에서Dev

포인터 및 참조 + 오버로드 된 연산자

분류에서Dev

malloc 및 realloc을 사용하여 char 포인터에 동적으로 문자열 추가

분류에서Dev

PHP로 리터럴 문자열 표시

분류에서Dev

이벤트에 대한 typescript 문자열 리터럴 메서드 오버로딩

분류에서Dev

C : 문자열, 배열 및 포인터? 어레이 오류?

분류에서Dev

C에서 문자열 리터럴을`unsigned char *`로 자동 변환하는 방법?

분류에서Dev

초기화되지 않음 및 메모리 오류 (문자열 및 포인터)

분류에서Dev

문자열을 char 및 int 데이터 유형으로 변환

분류에서Dev

Typescript : 문자열 배열을 문자열 리터럴로 변환

분류에서Dev

문자열 리터럴 및 배열의 주소

분류에서Dev

문자열 리터럴 및 메모리 표현

분류에서Dev

의 NumberFormat에서 오는 문자열 리터럴 및 문자열 이상 같음으로 인해 서로 다른 바이트 표현으로 실패

분류에서Dev

C의 NUL 문자 및 정적 문자 배열 / 문자열 리터럴

분류에서Dev

문자열 형식으로 문자열 리터럴 내부화

분류에서Dev

char 및 한 문자 문자열 상수에서 리터럴을 재사용하는 방법은 무엇입니까?

분류에서Dev

std :: string 및 C 스타일 문자열 리터럴 비교

분류에서Dev

형식 문자열 및 개체 리터럴이있는 Python SyntaxError

Related 관련 기사

  1. 1

    char 포인터 및 문자열 리터럴 오버로드

  2. 2

    문자열 리터럴 대 const char * 함수 오버로드

  3. 3

    문자열 리터럴 상수를 char const * 및 wchar const *로 한 번 정의

  4. 4

    char 포인터가 항상 동일한 문자열 리터럴을 가리키는 지 확인하십시오.

  5. 5

    Char 문자열 및 포인터에 대한 C ++ 질문

  6. 6

    문자열 리터럴에서 문자 배열 리터럴로

  7. 7

    문자열 및 리터럴 추가 (C ++)

  8. 8

    문자열 및 리터럴 추가 (C ++)

  9. 9

    기본 다국어 평면 외부의 문자 리터럴 코드 포인트로 char16_t 할당

  10. 10

    기본 다국어 평면 외부의 문자 리터럴 코드 포인트로 char16_t 할당

  11. 11

    메서드 호출에서 문자열 리터럴이있는 C ++ const char *

  12. 12

    char 배열을 문자 포인터 배열로 복사

  13. 13

    포인터 및 참조 + 오버로드 된 연산자

  14. 14

    malloc 및 realloc을 사용하여 char 포인터에 동적으로 문자열 추가

  15. 15

    PHP로 리터럴 문자열 표시

  16. 16

    이벤트에 대한 typescript 문자열 리터럴 메서드 오버로딩

  17. 17

    C : 문자열, 배열 및 포인터? 어레이 오류?

  18. 18

    C에서 문자열 리터럴을`unsigned char *`로 자동 변환하는 방법?

  19. 19

    초기화되지 않음 및 메모리 오류 (문자열 및 포인터)

  20. 20

    문자열을 char 및 int 데이터 유형으로 변환

  21. 21

    Typescript : 문자열 배열을 문자열 리터럴로 변환

  22. 22

    문자열 리터럴 및 배열의 주소

  23. 23

    문자열 리터럴 및 메모리 표현

  24. 24

    의 NumberFormat에서 오는 문자열 리터럴 및 문자열 이상 같음으로 인해 서로 다른 바이트 표현으로 실패

  25. 25

    C의 NUL 문자 및 정적 문자 배열 / 문자열 리터럴

  26. 26

    문자열 형식으로 문자열 리터럴 내부화

  27. 27

    char 및 한 문자 문자열 상수에서 리터럴을 재사용하는 방법은 무엇입니까?

  28. 28

    std :: string 및 C 스타일 문자열 리터럴 비교

  29. 29

    형식 문자열 및 개체 리터럴이있는 Python SyntaxError

뜨겁다태그

보관