2014-06-10 7 views
0

여러 문자열이나 char const *의 발견을 확인할 클래스를 만들고 싶었습니다. "무언가"가 상수이기 때문에 기대 했었습니다. 정적 const 매개 변수 .. 불행히도 그게 작동하지 않았다 .. 아무도 그 클래스와 함께 잘못 본거야?Variadic 템플릿 char const *

Finder<"firstStr", "secondStr"> finder; 

또는

static const char const* s_first = "first"; 
    static const char const* s_second = "second"; 
    Finder<s_first, s_second> finder; 

내가 점점 오전 오류입니다 :

template<char const*... Args_t> 
struct Finder { 

    Finder() { 
     Add<Args_t...>(); 
     m_len = sizeof...(Args_t); 
     m_count = 0; 
    } 

    void Append(char const* key, string val) { 
     Found_t::iterator found = m_founds.find(key); 
     if (key == m_founds.end()) return; // irrelevant 
     if (!found->second.empty()) { 
      stringstream str; 
      str << "Found an already existing key: [" << key << ']' << endl; 
      throw logic_error(str.str()); 
     } 
     found ->second = std::move(val); 
     ++m_count; 
    } 
    bool Complete() { return m_len == m_count; } 

private: 
    template<char const* First_t, char const*... Rest_t> void Add() { 
     m_founds.insert(Found_t::value_type(First_t, "")); 
     Add<Rest_t...>(); 
    } 
    template<char const* Last_t> void Add() { 
     m_founds.insert(Found_t::value_type(Last_t, "")); 
    } 
    typedef std::map<char const*, string> Found_t; 
    Found_t m_founds; 
    int m_len; 
    int m_count; 

}; 

는 다음 주에 내가 좋아하는 뭔가를 시도 표현식이 상수 값이 있어야합니다

+0

정확히 작동하지 않는 것은 무엇입니까? – stijn

+0

아래 질문의 본문에 오류를 추가했습니다. – Alon

+0

이 수업에서 무엇을하고 싶니? – stijn

답변

3

비 -type 템플릿 매개 변수는 몇 가지 규칙을 준수해야합니다. 기본적으로 고유해야합니다 (외부 연결을 사용하면 그들 만의 생성자이 더 이상 정확히) 트루되지 않은 코멘트에 지적으로 - 표준의 관련 부분 :

정적 저장 기간과 외부와 객체의 주소를 지정하는 상수 식 ( 5.19) 내부 링크 또는 기능 템플릿과 기능 템플릿 번호 S는 제외 비 정적 반원 포함 외부 또는 내부 링키지 함수, 또는 &가 수 있다는 것을 제외 & ID-식과 (괄호 무시) 표명 이름이 함수 또는 배열을 참조 할 경우 생략되며 생략됩니다 해당하는 경우 temp 샘플이 다른 몇 가지가 있습니다

extern const char s_first[] = "first"; 
static constexpr char s_second[] = "second"; 

Finder< s_first, s_second > f; 

편집 : 늦은 매개 변수는이 반면에 확인됩니다

두 예제는 일치하지 않는 보여 용도에 대한 참조입니다 문제 (Add의 모호한 정의, keym_founds.end()과 비교, Jarod42의 적절한 버전 :

template<char const*... Args_t> 
struct Finder { 

Finder() { 
    Add<Args_t...>(); 
    m_len = sizeof...(Args_t); 
    m_count = 0; 
} 

void Append(char const* key, string val) { 
    Found_t::iterator found = m_founds.find(key); 
    if (found == m_founds.end()) return; // irrelevant 
    if (!found->second.empty()) { 
    stringstream str; 
    str << "Found an already existing key: [" << key << ']' << endl; 
    throw logic_error(str.str()); 
    } 
    found ->second = std::move(val); 
    ++m_count; 
} 

bool Complete() { return m_len == m_count; } 

private: 
    template<char const* First_t, char const* Second_t, char const*... Rest_t> void Add() { 
    m_founds.insert(Found_t::value_type(First_t, "")); 
    Add<Second_t, Rest_t...>(); 
    } 
    template<char const* Last_t> void Add() { 
    m_founds.insert(Found_t::value_type(Last_t, "")); 
    } 
    typedef std::map<char const*, string> Found_t; 
    Found_t m_founds; 
    int m_len; 
    int m_count; 
}; 
+0

흠,하지만 수정 사항과 함께 컴파일 되었습니까? 그것을 고치기 위해 무엇을 제안 하시겠습니까? – Alon

+0

* it * :]을 정의하십시오. 클래스를 설치하면됩니다. 다른 많은 오류가 있기 때문에 모든 메소드를 컴파일하지 않습니다. – stijn

+0

it = 정확히 내 게시물에 대해서만 char 대신 extern 및 [] 초기화 됨 일부 문자열 초기화 됨 – Alon