2012-04-01 3 views
2

문제는 구체적이지만 솔루션은 종료되었습니다. 필자는 동료 프로그래머들과 함께 아이디어를 얻으려는 외로운 코더입니다.단일 멤버 (사용자 지정 구조)가있는 사용자 지정 구조체 (래퍼)의 컬렉션을 단일 멤버 컬렉션에 담습니다.

나는 수학 라이브러리 용 래퍼를 가지고 있습니다. 래퍼는 시스템에 일관된 인터페이스를 제공하면서 여러 플랫폼에서 수학 라이브러리를 전환 할 수있게 해줍니다. 래퍼에는 단일 멤버가 포함되어 있으므로 내 Matrix4x4 래퍼 클래스에는 래퍼의 유일한 멤버 인 api_matrix_4x4 구조가 있습니다.

내 현재 대상 플랫폼에는 랩퍼의 임베디드 멤버의 C 스타일 배열을 필요로하는 멋진 기능이 몇 개 있지만, 수학 API 함수에 대한 래퍼 함수는이를 노출하고 싶지 않습니다. 구성원 유형을 나머지 시스템에 추가하십시오. 따라서 우리는 함수에 들어가는 래퍼 (reference/pointer) 컬렉션을 갖고 있습니다. & 함수 안에있는 콜렉션에 필요하게되는 웨이퍼의 멤버는 수학 API에 전달 될 수 있습니다.

나는 C++ 11 기능을 포함하여 C++을 주로 사용하고 있으며 &도 C 스타일로 갈 수 있습니다. 이상적으로 예외가없는 해결책 인 &을 사용하여 모든 동적 할당이 아닌 동적 할당을 피하십시오. 래퍼 함수는 표준 라이브러리 배열이나 벡터 또는 배열에 대한 C 스타일 포인터를 매개 변수로 사용할 수 있습니다. 내부적으로 필요한 것은 무엇이든지 &이고 동적 캐스트는 없습니다 (런타임 유형 정보).

1) 하나의 맞춤 구조체를 포함하는 맞춤 구조체/클래스를 맞춤 구조체에 캐스트 할 수 있습니까? 그렇다면 표준 라이브러리 모음 인 경우에는 어떨까요? 여기에 타입 슬라이싱을 생각하고 있습니다.

2) 구현이 단일 유형 (사용 된 수학 API 기반)에서만 작동 할 수 있지만 템플릿을 사용하여 함수에 전달 된 마스크를 사용 하시겠습니까? 아니면 나쁜 것으로 간주되는 템플릿을 사용합니까?

3) 아마도 스왑/이동 의미/배치와 관련된 멋진 솔루션을 생각해 낼 수 있습니까? 그렇다면 제게 그것에 대해 말해주십시오.

4) 아니면 분명히 하나의 컬렉션을 반복하면서 멤버를 다른 멤버로 가져간 다음 API 함수를 사용하여 그걸 사용하고 있습니까?

는 내가 래퍼 구조체 & 래퍼 함수 서명에 의해 뭐하는 거지의

예, 내가 피하려고하고 무엇을 & 예는 기능 구현에 의해 주어진 일을 :

struct Vector3dWrapper 
{ 
    API_Specific_Vector_3d m_api_vector_3d; 

    inline void operation_needing_vector_3d_wrappers(std::vector<Vector3d>& vectors) 
    { 
     // Now need a collection of API_Specific_Vector_3ds 
     try 
     { 
     std::Vector<API_Specific_Vector_3d> api_vectors; 
     api_vectors.reserve(vectors.size()); 
     for(auto vectors_itr = vectors.begin(); vectors_itr != vectors.end(); ++vectors) 
     { 
      // fill each Vector3d.m_api_vector_3d into api_vectors 
     } 
     } 
     catch(std::bad_alloc &e) 
     { 
     // handle... though in reality, try/catch is done elsewhere in the system. 
     } 



     // Signature is API_Multiply_Vectors_With_Matrix_And_Project(API_Specific_Vector_3d* vectors, size_t vector_count) 
     API_Multiply_Vectors_With_Matrix_And_Project(&api_vectors, api_vectors.size()); 
    } 

}; 
+2

이 질문은 폭 넓은 주제를 다루고 있습니다. 몇 가지 예를 들어 구체적으로 설명해 주시겠습니까? – leftaroundabout

답변

1
  1. 당신은 전송할 수 있습니다 표준 레이아웃 구조체 (예 : C와 호환되는 구조체)를 첫 번째 멤버에 전달하지만 그 요점은 무엇입니까? 첫 번째 멤버에 액세스하여 &을 적용하면됩니다.

  2. 템플릿은 일반적으로 일련의 유형에 대해 균일 한 매개 변수화를 허용합니다. 한 번만 인스턴스화 된 템플릿을 작성할 수 있지만 무의미한 것으로 보입니다. 당신이 정말로 원하는 것은 각 플랫폼을위한 다른 인터페이스 라이브러리입니다. 아마도 템플리트는 이들 사이에 공유되는 공통 코드를 정의하는 데 도움이 될 수 있습니다. 또는 평범한 C에서 typedef#include 앞에 설정하여 동일하게 수행 할 수 있습니다.

  3. 무엇에 대한 해결책? 기본 복사 및 이동 의미는 숫자가 들어있는 플랫 C 스타일 구조체에서 작동합니다. 딥 카피에 관해서는 기본 라이브러리에 포인터 기반 구조가있는 경우 필요한 모든 의미를주의 깊게 구현해야합니다.안전 ... 간단 ... 기본값 ... "멋진"소리가 더럽습니다.

  4. 내가 컬렉션으로하는 일을 잘 모르겠다. 모든 함수는 매개 변수를 먼저 일반 컨테이너 객체에 삽입해야합니다. 콘테이너를 건설하는 것은 비싸게 들린다. 함수는 기본 라이브러리의 함수를 가능한 한 병렬 처리해야합니다.

+0

고맙습니다. 1은 유용합니다. 나는 2가 저에게 획일 화 된 parameterization을 허용 할 것이라고 생각했지만, 여러분은 단 한번의 인스턴스화만으로도 마스크보다 조금 더 나은 것입니다. 3 그들은 평평한 C 스타일의 구조체를 위해 일한다는 것을 알고 있으며, 회원과 관련하여 포인터가없는 깊은 복사본이 필요 없다. Re 4, 25 수학 함수의 2 함수입니다. 수학 API에는 전달할 래핑 할 형식의 컬렉션이 필요합니다. 래퍼에서 외부로 이러한 유형을 노출하고 싶지 않습니다. – codey

+0

3 인 경우, 안전성에 문제가 있지만 "영리하고 효율적인"컨테이너 + 유형 변환 관용구/트릭을 찾고 있었다고 생각합니다. 아마, 내 머리 꼭대기에서 랩퍼 컨테이너 매개 변수를 통해 반복하는 것과 같은 것이고, 함수 - 로컬 래퍼 - 멤버 컨테이너로 캐스팅 + emplace 할 수도있다. 정말 좋은 아이디어. 수학 코드는 상대적으로 효율적이어야합니다. 그렇지 않으면 API 유형 컬렉션을 API 유형 컬렉션 변환으로 수행하여 API가 제공하는 최적화 (SIMD 명령어, 네온 등)를 낭비하게됩니다. – codey

+0

@codey 플랫폼에 잠재적으로 벡터화와 같은 멋진 최적화 작업을 수행하려면 최적화 프로그램을 위협 할 수있는 캐스트를 피하기 위해 매우 신중해야합니다. 실제로, 컴파일러는 당신이 일을 간단하고 시맨틱하게하기를 좋아합니다. 라이브러리가 몇 개의 typedef와 한 줄짜리 인라인 함수로 구성 될 수 있다면 그렇게해야합니다. 기본 함수가 컨테이너 유형을 필요로하지 않고 사용자가 필요하지 않은 경우 추가 비용과 노력을 고려해야하는 이유는 무엇입니까? – Potatoswatter

관련 문제