2011-08-28 5 views
1

저는 Vec3 클래스를 코딩하고 있습니다. 최적화를 위해 생성자가없는 상태로 만듭니다. 또한 멤버를 x, y, z 또는 r, g, b OR로 탭에 액세스 할 수 있기를 원합니다. 나는 아무의 ctor이 없기 때문에, 나는 다음과 같이 초기화하고 싶습니다struct의 초기화를 멋지게 초기화합니다.

template <typename T> struct Vec3_t  
{  
    union  
    { 
     T val[3];  
     struct { T x, y, z; };  
     struct { T r, g, b; };  
    }; 
}; 

그리고 노동 조합을 사용합니다 : 쉬운, 당신은 생각

Vec3_t<int> v = {1, 2, 3}; 

하지만 난 이후 이중 중괄호를 넣어야 할

그래서, 내 질문은입니다 : '(Vec3_t<int> v = {{1, 2, 3}} 같이) : 구조체의 구조체를 초기화 해요 내가 한 쌍으로 모두 다른 이름으로 액세스 및 초기화를 가질 수 있도록 어떻게 그것을 할 수 중괄호?

내 시도 : 각 구성 요소에 대해 하나의 공용 구조체가 있지만 테이블로 액세스하여 종료 할 수 있습니다 (항상 &vx를 호출하여 float [3]로 처리 할 수 ​​있지만 더럽지는 않습니다 ...). 그래서 안전하다고 생각합니다)

+3

조숙 한 최적화는 모든 악의 뿌리입니다. 이것은 템플릿 클래스이므로 생성자의 소스는 컴파일 할 때 사용할 수 있습니다. 대부분의 최신 컴파일러는이 모든 정보를 사용하여 최적의 코드를 생성합니다. 시간을 절약하고 생성자를 작성하십시오. –

+0

사실, 나는 '새로운 Vec3_t [x]'를 할 때 아무 것도 불리지 않기 위해 ctor를 원하지 않았다. 그러나 나는 방금 약간의 테스트를했고, 그것은 빈 디폴트 ctor를 갖는 것이 같은 것을 허용하는 것처럼 보입니다 ... 나는 ctor에 갈 것이라고 생각합니다. – Zonko

+0

@ Zonko 아래의 내 대답이 문제를 해결 한 경우 답변 옆에있는 체크 표시 (위아래 화살표 아래)를 클릭하여 답을 표시 하시겠습니까? –

답변

1

생성자가 없으면이 작업을 수행 할 수 없으므로 아무리해도 ctor를 사용하지 않는 것이 좋습니다.

5

컴파일러가이 C++ 11 기능을 지원하는 경우 std::initializer_list을 사용하는 생성자를 만들 수 있습니다 (생성자를 갖고 싶지 않다고 말한 것을 알고 있지만이 솔루션에는), 미안 [하지만 난 당신이에 최적화이있는 경우 전혀 성능 저하의 원인이 생각하지 않는다] :

Vec3_t(std::initializer_list<T> list) : val(list) { } 

그런 다음 CONSTRUC 수 당신 같은 Vec3_t 원하는 T :

Vec3_t<int> v = {1, 2, 3}; 
+0

생성자를 허용하면'Vec3_t v (1,2,3);'... –

+0

@Kerrek true를 받아 들일 수 있습니다. 나는 왜 그가 생성자를 원하지 않는지 알지 못한다. 그런 간단한 코드는 배열을 초기화하는 것보다 느리지는 않을 것이다. –

+0

이것은 질문에 대답하지 않습니다 : 당신은 ctor로 문제를 해결합니다.Kerrek이 말했듯이, ctor를 사용하면 "정상"으로 만들 수 있습니다. – Zonko

0

당신이 ctor에없는 클래스를 초기화에 얻을 수있는 가장 가까운 세 가지 미리 정의 된 개체를 사용합니다. 각각 하나의 유니온 유형으로 초기화됩니다. 작성중인 새 오브젝트에 원하는 종류 중 하나를 지정하십시오.

T t1;// array 
T t2;// xyz 
T t3;// rgb 

T newT = t1; 

그렇다면 왜 원하지 않는 이유 이외에 Ctor를 가질 수 없는지 상상하기 어렵습니다.

관련 문제