문제는 구체적이지만 솔루션은 종료되었습니다. 필자는 동료 프로그래머들과 함께 아이디어를 얻으려는 외로운 코더입니다.단일 멤버 (사용자 지정 구조)가있는 사용자 지정 구조체 (래퍼)의 컬렉션을 단일 멤버 컬렉션에 담습니다.
나는 수학 라이브러리 용 래퍼를 가지고 있습니다. 래퍼는 시스템에 일관된 인터페이스를 제공하면서 여러 플랫폼에서 수학 라이브러리를 전환 할 수있게 해줍니다. 래퍼에는 단일 멤버가 포함되어 있으므로 내 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());
}
};
이 질문은 폭 넓은 주제를 다루고 있습니다. 몇 가지 예를 들어 구체적으로 설명해 주시겠습니까? – leftaroundabout