2011-02-13 2 views
5

그래서 어떤 종류의 범위에서 정의 된 구조화 된 데이터를 저장하기위한 파일 형식으로 작업하고 있습니다. 가장 간단한 예제는 시간이 지남에 따라 float 값과 같은 것이지만, 각 포인트에서 여러 차원과 임의의 데이터를 허용하도록 설계하고 있습니다. 파일 헤더에 데이터의 구조를 저장하고 싶습니다. 일부 청초한 기능을 사용할 수 있기 때문입니다.C++에서 구조체 정의를 검사하고 있습니까?

는 처음에 나는 사용자가 클래스의 계층 구조를 사용하여 데이터 구조를 구축 거라고 생각했다, 그래서 당신은 같은 것을 할 수있는 :

pf_type data = record(PF_DOUBLE) (
        record("position")(
        field("xp") & 
        field("yp") & 
        field("zp")) & 
        record("velocity")(
        field("xv") & 
        field("yv") & 
        field("zv")) & 
        record("acceleration")(
        field("xa") & 
        field("ya") & 
        field("za"))); 

C에서 이런 일에 해당하는 것 :

struct { 
    struct position { 
     double xp,yp,zp; 
    } 
    struct velocity { 
     double xv,yv,zv; 
    } 
    struct acceleration { 
     double xa,ya,za; 
    } 
} 

끔찍한 것은 아니지만 사용자가 데이터 읽기/쓰기시 실제로 사용할 구조체를 별도로 정의해야합니다.

필자는 라이브러리에 전달한 일반 C-struct를 정의 할 수 있으면 정보를 파일에 기록하기 위해 introspect하면된다고 생각했습니다. 비록 내가 C + +에서 원격으로 가능할 지 모르겠지만. 내 생각에 그것은 일부 템플릿 메타 프로그래밍 마법을 사용하고있을 수도 있지만 매우 지저분 할 것입니다. 그래서 저는 C++에 대해 더 많이 알고있는 사람들로부터 아이디어를 얻기를 바랍니다.

+2

당신은 본질적으로 DSL을 만들고 더 수반 노력을 이겨내는 없다있어). – wheaties

+2

나는 wheaties에 동의하지만 더 적극적으로 공식화하겠습니다. 당신이하고있는 일은 좋은 생각입니다. 즉, 그것은 건전한 디자인이며, 우리가 당신을 단념하게하지 마십시오. C++은 이런 종류의 작업에 거의 도움이되지 않습니다. –

+0

그게 내가 생각한거야, 난 기본적으로 템플릿을 사용하여 구조 파서를 써야겠다고 생각, ick. –

답변

7

아니요 정확히 무엇을 찾고 계신지 모르지만 영감을 얻기위한 좋은 자료는 Google's Protobufs입니다. 그들은 당신이 질문에서 토론했던 것과는 약간 다른 접근법을 취합니다. protobuf를 사용하면 먼저 데이터 구조를 .proto 파일로 설명하고 protobuf 컴파일러 (protoc) codegens는 C++를 비롯한 여러 언어 중 하나에 대한 상용구 코드를 작성합니다.

codegened 코드는 .proto 파일에 정의 된 구조를 완전히 반영 할 수 있으며 가장 최적화 된 protobuf는 와이어를 통해 전송되도록 이진 데이터를 serialize하는 것입니다. 분명히 성능에 약간의 차이가있을 수 있지만 실제로는 고품질의 반사 효과를 얻을 수 있으며 단순한 액세스를위한 성능은 그다지 높지 않습니다.

기본적으로 라이브러리 클라이언트는 사용자에게 프로토 타입을 전달할 수 있습니다. 직접 전화를하거나 네트워크 통화를 통해.

+0

그게 내가 결국 끝내는 방법일지도 몰라. 나는 모든 것을 자기 생각 속에 담아두고 싶었다. ... –

3

템플릿 기계는 이러한 종류의 작업을 합리적으로 수행하기에는 너무 원시적입니다. 더 나은 옵션은 데이터 구조를 설명하는 파일을 쉽게 편집하고 파싱하기 쉽도록 만든 다음 해당 정의에서 필요한 C++ 코드를 생성하는 것입니다.

C++ 입출력, 구문 분석, 형식 지정 및 문자열 조작이 차선이기 때문에 C++에서 코드 생성기를 작성하는 것은 성가신 일이지만, 제 제안은 Python 또는 다른 부분을 very high level language으로 사용하는 것입니다.

모든 것이 아마도 적절한 종속성을 가진 Makefile에 넣어 질 수 있습니다 (즉, 설명 파일이 변경되면 C++ 파일을 재생성합니다). 따라서 빌드가 자동으로 이루어집니다.

서식 파일 대신 "일반"C++ 파일을 사용하면 컴파일 시간, 오류 메시지, 하드 코어 서식 파일의 컴파일러 비 호환성, 생성 된 코드 디버깅 지원 등을 훨씬 쉽게 할 수 있습니다.

+0

나는 마지막 단락에서 불필요한 논증과 열의가있을 때까지 완전히 동의한다. 그것을 제거하는 것이 훨씬 더 나은 대답이지만, 이것은 또한 protobufs를 기술하는 대신 일반적인 용어를 제외하고는 sblom의 답과 가깝습니다. –

+2

@Fred Nurk : 좋습니다 ... 나는 과도하게 과민 반응을 보였다. 그러나 IMO가 C++ 커뮤니티에 접근 한 것과 같은 절대적으로 유일한 표본이되는 손상의 양은 놀랍습니다. 많은 C++ 프로그래머가 빈약 한 도구를 사용하여 문제가 아닌 문제를 해결할 수 있도록 벽을 머리에 대고 있습니다. – 6502

+0

많은 프로그래머가 스스로를 단일 언어로 잠그고 자신의 도구 상자를 만들고 여러 도구를 결합하는 대신 코드 생성 등의 이점을 놓치게됩니다. 이는 프로젝트에 적합한 단순한 도구 (make와 같은 심각한 제한이 있지만 다른 빌드 시스템도 있음)를 결합하는 것보다는 디자이너의 아이디어를 따르도록 요구하는 IDE에 의해 악화됩니다. 같은 맥락에서 필자는 Python도 좋아하지만 다른 도구들도 그 차이를 메울 수 있습니다. –

0

Boost.Fusion에는 C++에 컴파일 시간 반영을 가져 오는 몇 가지 깔끔한 트릭이 있는데, 귀하의 경우에는 BOOST_FUSION_ADAPT_STRUCT에 가장 관심이 많을 것이라고 생각합니다.

예를 들어 문자열에서 필드를 가져올 수 있도록 추가 오버로드를 추가하려는 경우. 보완적인 능력을 추가해야합니다.

모든 것은

은 매크로와 템플릿을 수행 할 수 있습니다 ...하지만 오히려 protobuf으로 다루고 싶어요;

관련 문제