그동안 C++을 하면서 느낀 건, 몇 십줄 설명하는 것보다 그냥 코드를 보여주는 게 더 낫다는 것이었다. 그러므로 실행 성공한 코드를 먼저 올린다.
#include <iostream>
using namespace std;
enum class ElementType
{
Position3D,
Color
};
template <ElementType first, ElementType... rest>
class Vertex
{
private:
void Process(ElementType t)
{
cout << "뀨" << endl;
}
template<typename ElementType, typename ... Args>
void Process(ElementType t, Args... args)
{
Process(t);
Process(args...);
}
public:
Vertex()
{
Process(first, rest...);
}
};
int main()
{
Vertex<ElementType::Position3D, ElementType::Color> v2;
}
저번에 AddComponent를 만들 때 사용한 템플릿 문법에 대해 조금 더 깊은 공부를 해보았다.
Vertex제작 시 단순히 구조체를 여러개 만드는 방법도 있었겠지만 임의의 파라미터를 받을 수 있다는 점이 너무나 매력적이었기 때문에, 공부도 할 겸 힘든 길을 선택했다.
템플릿에서 <> (꺾쇠) 안에 들어가는 값을 마치 변수처럼 사용할 수도 있는데, 위에 쓴 것 처럼 enum class의 경우 저런 식으로 first, rest라는 변수로 받아올 수가 있었다.
왜 ElementType... elements 라고 쓰지 못 하였나 하면, elements를 분리할 방법을 도저히 찾을 수 없었기 때문이다. 그래서 선택한 것이, 입력된 arguments 중에 첫 번째 요소를 대상으로 함수를 돌리고, 그다음 요소들을 다시 재귀 함수로 호출하도록 하는 방법이었다.
그래서 Process 함수는 2개의 오버로드가 있는데, 하나는 딱 한개의 ElementType만 가지고 작업을 수행하는 녀석으로 함수 본체이고, 템플릿으로 되어있는 녀석은 단순히 임의의 파라미터를 받기 위하여 선언한 함수이다.
만들고 보니 참 허탈하고 코드도 몇줄 안되지만, 이 녀석을 만들기 위해 몇 시간동안 검색하고 영어로 된 문서들을 머리 터지면서 공부했다.
'Programming' 카테고리의 다른 글
Enum Template 응용 :: 강제 형 변환하여 char 데이터 배열을 원하는 타입으로 출력 (0) | 2020.01.22 |
---|---|
Template 연구 - Enum과 Template 임의 다중 상속 (0) | 2020.01.21 |
[C++] 임의의 파라미터를 받는 Template 만들기(feat.std::make_unique) (0) | 2020.01.15 |
[C++] std::unordered_map // std::unordered_multimap (0) | 2020.01.15 |
[C++]delete unique_ptr<T>.get() (0) | 2020.01.09 |