2009-02-06 5 views
0

아래 코드는 std :: string ASCII 코드로 표현하는 데 사용됩니다.메소드 템플릿 만들기 - C++

string Helpers::GetStringFromASCII(const int asciiCode) const 
{ 
    return string(1,char(asciiCode)); 
} 

잘 작동합니다. 하지만 제 응용 프로그램에서는 컴파일 타임에 ASCII 코드를 알고 있습니다. 그래서

string str = GetStringFromASCII(175) // I know 175 at compile time 

질문

처럼 호출됩니다 처리가 컴파일시에 발생하는 것을 나는 각 시간에 함수를 호출 피할 수 있도록 GetStringFromASCII에게 방법 템플릿을 만들 수있는 방법이 있습니까 실행 시간.

의견이 있으십니까?

#include <iostream> 
#include <string> 

using namespace std; 

template <int asciiCode> 
inline string const &getStringFromASCII() 
{ 
    static string s(1,char(asciiCode)); 
    return s; 
} 

int main(int, char const**) { 
    cout << getStringFromASCII<65>() << endl; 
} 

편집 : 이런 일에 대해 어떻게

+0

무엇을 원하십니까? 템플릿은 당신에게 0을 살 것입니다. 불행한 경우 실행 파일 크기를 늘리면 런타임 값을 전달할 수 없습니다. –

+0

주의 : ASCII는 [0; 127]으로 제한되며, 175는 ASCII 문자가 아닙니다. –

답변

0

문자열 변환 기능을하는 int 상수 공급의 지금

+0

이렇게하면 성능상의 이점이 거의 없습니다. 'char'형 변환은 여전히 ​​실행 중이고 런타임시 발생하며 문자열 생성자 호출도 마찬가지입니다. –

+0

답장을 보내 주셔서 감사합니다. 정적을 사용한 이유는 무엇입니까? 문자열을 반환하는 것이 잘못된 이유는 무엇입니까? –

+0

코드에서 getStringFromASCII는 항상 호출되지 않습니다. 컴파일러는 전문화를 만들고이를 사용합니다. –

3

대신 심판을 반환은, 일정한 직접 문자열을 사용하십시오

string str("\xAF"); // 0xAF = 175

그런데 루프에서 과도한 성능 요구를 제외하면 일부 CPU 사이클에 대한 거래 코드 가독성은 전반적으로 거의 효과가 없습니다.

+0

간단 해 보입니다. 프레드릭 (Frederick)이 말했듯이, 템플릿을 사용하면 여기에 어떤 이득도 얻지 못할 것 같습니다. –

+0

네가 맞다. 성능 향상을 원한다면 어느 쪽이든 사용한다 정적 const 문자열 STRING_175 ("\ xAF"); 그런 다음 const 변수를 참조하거나 – jturcotte

+0

실제로 -이 속도가 느립니다! const char * str = "\ xAF" 을 std :: string으로 자동 캐스팅합니다. "\ xAF"에 strlen을 할 필요가 있습니다. – MSalters

4

이런 유형의 템플릿 메타 프로그래밍은 intfloat과 같은 기본 데이터 유형을 처리 할 때 잘 작동합니다. 반드시 문자열 객체가 필요하면 std::string 생성자를 호출하는 것을 피할 수 없으며 컴파일 타임에 호출이 발생할 수 없습니다. 또한, 캐스트를 char으로 드래그하여 시간을 컴파일 할 수 있다고 생각하지 않습니다. 템플릿이 여기에 도움이되지 않는다는 것을 의미합니다.

+0

답장을 보내 주셔서 감사합니다. 그래, 여기 템플릿이 필요 없어. –

0

왜 도우미 기능으로 귀찮게합니까?

string s(1, char(175)); 

당신이 필요로하는 것이 모두 당신이 얻는 가장 빠른 것입니다.

관련 문제