동일한 클래스 내에 std :: map 및 std :: vector 기능을 제공 할 수 있습니까?C++의 하이브리드 (List + Dict) 컨테이너 11
그렇지 않은 경우 무엇이 장애물입니까?
stdlib에 대한 경험이 없으므로 미리 고려해야 할 바보 같은 생각이라면 사전에 사과드립니다. 나는 독자가 나는이 대안을 고려하고 이유를 볼 수 있도록 아래에있는 내 시나리오를 제시 하 고 싶습니다 :
내가 파이썬 런타임 주위에 C++ 래퍼를 재 작성의 마지막 단계입니다. 아이디어는 내 C++ 프로젝트가 파이썬 스크립트를 실행할 수 있다는 것입니다. 파이썬 모두에서
가 PyObject
, 그리고 내가 Object
클래스는 파이썬의 붙박이 유형 (부울, 정수, 부동 소수점, 유니 코드, 바이트, 설정,리스트, 튜플의 다스의를 가리키는 할 수있는 PyObject*
포장이, 사전, 호출 가능, 모듈).
파이썬의 카멜레온 입력을 C++로 미러링하고 싶습니다. 그것은 경우
cout << my_seq[3]
my_seq[4] = foo
for(auto item : my_seq) {...}
그리고 : 랩의 PyObject 경우
그래서 {세트, 목록, 바이트, 유니 코드, 튜플}이 모든 시퀀스는, 그래서 내가 좋아하는 일을 할 수 있도록하고 싶습니다 사전, 내가 할 수있는 :
my_dict["someKey"] = someValue;
for(auto kv_pair : my_seq) {...}
등 원래의 프로젝트는 빠른 열거 등 시작, 끝, 반복자에 필요한 다음 stdlib 컨테이너 기계가 포함 된 SeqBase 클래스를했다
, const_iterator, 등등. 그리고 이것으로부터 파생 된 {set, list, bytes, unicode, tuple}. 코드 here.다른 시작, 끝, 반복기, const_iterator 등이 포함 된 MapBase 클래스도 있습니다. 코드 here.
나는이 두 컨테이너를 혼합하여 단일 Object 클래스에서 모든 것을 처리 할 수 있기를 바랍니다.
하지만 가능한지 확실하지 않습니다. 내가 볼 수
즉각적인 장애물은 이러한 형식 정의는 다음 stdlib 알고리즘 개체를 처리하기 위해 존재해야하는 것처럼
// SeqBase
typedef size_t size_type;
typedef seqref<T> reference;
typedef T const_reference;
typedef seqref<T> *pointer;
typedef int difference_type;
typedef T value_type; // TMM: 26Jun'01
// MapBase
typedef size_t size_type;
typedef Object key_type;
typedef mapref<T> data_type;
typedef std::pair< const T, T > value_type;
typedef std::pair< const T, mapref<T> > reference;
typedef const std::pair< const T, const T > const_reference;
typedef std::pair< const T, mapref<T> > pointer;
것 같습니다. 그러나 그것은 하나의 세트 또는 다른 세트를 선택할 필요가있는 것처럼 보입니다. 네 가지 예에서 포인터 typedef는 두 경우 모두 다릅니다.
어떤 솔루션이 있을까요?
어쩌면 템플릿 개체 수 및 metaprogramming 사용하여 개체 및 개체 허용 어쩌면 관련 이터레이터 전환하려면 SFINAE 사용하십시오.
이것은 서브 클래 싱보다 나빠질 것 같지만, 갖고있는 모든 옵션을보고 싶습니다.
미리 지정하지 않아도이를 수행 할 수있는 방법이 있는지 궁금합니다.내가 잘못 사용될 수있는 코드를 생성에 대해 우려하지 않다
, 등 목록에 사전-일을하지 않는 소비자의 책임입니다
(참고 : 여담, 난 이미 금이 한로 시퀀스 형식의 개체 및 사전에 A["key"] = B[42]
형식 구문을 사용하는 문제. 내가 직면하는 유일한 명백한 문제는 빠른 열거 형을 사용하도록 설정하는 것입니다. for(auto item:my_obj)
, 그러나 아직 최종 용도에 초점을 맞추지 않았으므로 일반적인 사용 시나리오를 선점하기 위해).
당신이 제공 할 수 있도록 할 필요'시작 ...하지만 그것에서 멀리 이동 주저 것 '및'end' 함수를 사용하면 사용자 정의 반복자를 제공 할 수 있습니다. 참조 : http://www.cs.northwestern.edu/~riesbeck/programming/c++/stl-iterator-define.html – IdeaHat
정확하게 하시겠습니까? Python 비트가 질문과 관련이 있습니까? – Barry
"C++ Python wrapper"를 파싱 할 수 없습니다 - 어떤 언어가 줄 바꿈합니까? – Eric