2013-03-21 2 views
1

char* 클래스 또는 구조체의 멤버를 C ​​++로 열거 할 수 있습니까? 그렇다면 변수 이름을 문자열로 출력 할 수 있습니까? 전처리 기 사용?멤버 변수 이름을 문자열로 변환

모든 const char * 멤버가있는 클래스가 있습니다. 각 멤버 변수를 열거하고 이름을 문자열 키에 대한 문자열로 확인하는 우아한 방법이 있다면 좋을 것입니다.

다음은 사용할 수있는 코드의 종류입니까?

누구나이 방법을 생각할 수 있습니까?

class configitems { 
public: 
    configitems() : host(0), colour(0) {} 
    const char* host; 
    const char* colour; 
    //... etc 
}; 

int main() { 

    configitems cfg; 
    //cfg.colour = "red"; 

    //receive an config item as a string. I want to check that the item is a valid one (eg is a 
    //variable of class configitem) and then populate it. 

    //eg get colour=red so want to do something like this: 
    if(isConfigItem("colour")) { 
     cfg.<colour> = "red"; 
    } 
    return 0; 
} 
+0

없음을, 그리고 당신이 어쨌든 문제가 길을 잘못 접근하고있어 보인다. –

답변

1

. 그것은 디버그 기호 나 그와 같은 것으로 존재할 수도 있지만, 변수가 어디에 있는지를 결정하기 위해 접근하는 것은 끔찍한 혼란입니다 [컴파일러가 현재 레지스터 나 메모리 위치를 사용하여 저장하고 있는지 여부에 따라 다른 위치에있을 수 있습니다 그 가치 등, 등].

매개 변수의 이름과 일치하는 strin을 생성하는 매크로를 사용할 수 있습니다.

그러나, 구성 유형의 것들에 대해 서로 다른 메커니즘을 사용하는 것이 아마도 더 나은 - 분명 몇 가지 옵션은 다음과 같습니다

  1. 배열이나 std::pair<std::string, std::string>
의 벡터를 사용하여 std::map<std::string, std::string>
  • 사용

    다른 구성 설정과 해당 변수로의 변환을 이해하는 고정 코드를 사용할 수도 있습니다. 엄청난 숫자가없는 한 나쁜 해결책이 아닙니다.

    또는이 같은 배열을 만들 수있다 :

    enum config_vals 
    { 
        host, 
        color, 
        ... 
        max_config 
    }; 
    
    struct translation 
    { 
        const char *name; 
        config_vals val; 
    }; 
    
    #define TRANS(x) { #x, x } 
    
    translation trans[]] = { 
        TRANS(host), 
        TRANS(color), 
    }; 
    
    class configitems 
    { 
        ... 
        std::string value[max_configs]; 
        ... 
    } 
    
    ... 
    
    configitems c; 
    ... 
    if (c.value[host] == "localhost") ... 
    
  • 1

    C++에서는 변수 이름을 문자열로 변환 할 수 없습니다. 변수 이름이 컴파일 된 실행 파일에 존재하지 않는 경우도 있습니다 (범위 지정 및 표시 여부에 따라 다름).

    가능한 경우에도 클래스 구성원을 열거하는 것은 여전히 ​​불가능합니다.

    이 문제에 대한 또 다른 방법은 std::map을 사용하여 "호스트"와 같은 문자열을 키로 사용하고이를 열거하는 것입니다.

    +0

    매크로를 사용하면 변수 이름을 문자열 표현 –

    +0

    으로 변환 할 수 있습니다. @IvayloStrandjev : True이지만 특정 변수는 이미 하드 코딩되어 있으므로 이름을 하드 코딩 할 수도 있습니다. 어쨌든 OP는 열거 형을 원하며 이는 매크로로도 가능하지 않습니다. – Linuxios

    0

    C++에서 수행하려는 작업을 정확하게 수행 할 방법이 없습니다. 그러나 원하는 모든 것이 키 - 값 쌍의 모음이면 솔루션이 있습니다.

    예를 들어

    대신 class configitems, 그것을 std::map<std::string, std::string> configitems합니다

    코드를 컴파일 다른 사람이 말했듯이, 실제로 생성 된 코드에 존재하지 않는 변수의 이름은 컴파일러가 완료되면
    std::map<std::string, std::string> configitems; 
    //... 
    configitems.insert(std::pair<std::string,std::string>("colour", "red")); 
    
    관련 문제