2013-04-25 3 views
1

myfun(std::string parm1)C++ 시행 네임 스페이스 준수

approvedParams에서 유형 std::string의 필드를 동의에 myfun 서명을 제한 할 수있는 기능을 존재 approvedParams의 범위 이외의 네임 스페이스

approvedParams { 
    std::string s1 = "my_string_input_1"; 
    std::string s2 = "my_string_input_2"; 
} 

있다고 가정 네임 스페이스?

즉 :

myfun("my_string_input_1")가 컴파일되지 않습니다.

myfun(approvedParams::s1)이 컴파일됩니다.


나는 enum으로 구현을 고려하고있었습니다. 그러나 궁극적으로 키 - 값 구성 파일을 구문 분석 할 때 approvedParams::s1s2을 사용하고 싶습니다. enum은 필수 유형이어야합니다. 난 map<int,std::string>std::string와 열거 형 정수를 연결하는 다른 불필요한 레이어를 추가에 관심이 아니에요.

+3

대신 enum을 사용 하시겠습니까? –

+0

내 지식으로는 enum은 int 유형이어야합니다. 궁극적으로 문자열을 포함하려면 s1과 s2가 필요합니다. – bartonm

+2

enum 값을 배열의 문자열에 대한 인덱스로 사용합니다. –

답변

4

유형 s1s2가 선언 된 네임 스페이스에 대한 정보를 전달하지 않습니다.

당신은 오히려 쉽게하지만 사용자 정의 유형을 포장 할 수있다.

namespace approvedParams 
{ 
    struct keytype { std::string val; }; 
    keytype s1 = { "my_string_input_1" }; 
    keytype s2 = { "my_string_input_2" }; 
} 

void approvedParams(approvedParams::keytype); 
+0

C에 익숙했기 때문에 네임 스페이스의 값을 감쌀 수 있다는 사실을 잊어 버렸습니다 : P –

+0

왜 멤버에'std :: string'을 사용하고 있습니까? – 0x499602D2

+0

나는이 구현을 좋아한다. 비록 struct string {std :: string val; } 오해의 소지가있는 것 같습니다. 아마도 ... struct keytype {std :: string val; } – bartonm

2

승인 매개 변수의 enum

enum approvedParams { 
    val1 = 0, 
    val2, ... 
}; 

값 그리고 단지의 DrewDormann의 생각 @ 재사용,

std::string[] approvedParamValues = { "my_string_input_1", ... }; 
1

는 여기에서 필자의 이러한 인덱스를 사용하여 문자열 배열을 만들기 랩퍼 유형이지만 실제로는 을 사용합니다.

아이디어는 기본적으로 명명 된 생성자 관용구의 변형이지만, 본격적인 팩토리 기능 대신 정적 변수 만 사용합니다 (이 패턴은 이름이 있습니까?).

// Declaration in .h 
class ApprovedParam 
{ 
public: 
    static const ApprovedParam foo; 
    static const ApprovedParam bar; 

    const std::string& value() const { return m_value; } 

private: 
    std::string m_value; 

    ApprovedParam(const char* value) : m_value(value) {} 
    ApprovedParam(std::string&& value) : m_value(std::move(value)) {} 
    ApprovedParam(const std::string& value) : m_value(value) {} 

    // IMPORTANT: the user must not be able to default construct an ApprovedParam 
    ApprovedParam() = delete; 
}; 

// Definitions in .cpp 
const ApprovedParam ApprovedParam::foo = "foo"; 
const ApprovedParam ApprovedParam::bar = "bar"; 

이제 사용자는/이동/복사 ApprovedParam 객체를 할당하지만 그는 선택 (불변) 인스턴스의 제한된 집합을 가지고 있으며, 그는 완전히 새로운 것을 만들 수 없습니다 수 있습니다.