C++ 템플릿 특화중에 특이한 사실중에 하나는, Inner Class의 완전특화가 C++표준이 아니라는것이다. 그래서 Inner Class를 완전특화에서 사용하면 gcc에서는 컴파일이 안된다.
회사에서 매주 월요일 점심시간 짜투리에 CodeDojo 라는 이름으로 Programming Challenges 책의 문제를 푼다.(하긴, 이것도 월요일날 학교를 가게되어서 앞으로는 하지 못할것 같다.) 문제들은 전형적인 ACM 문제유형으로 인풋이 주어지면 문제를 해결한 적절한 아웃풋을 만들어내야하는 식이다.
참여횟수가 늘어나면 인풋을 적절히 일반화를 해보고자 하여 템플릿을 사용하게 되었는데, 이를테면 인풋의 값을 string 형태로 보관한다거나 혹은 int 형태로 보관할수 있게 만들고자했다. 여기에 보통 '0 0'를 입력하면 입력을 종료한다는 조건이 붙는데 stirng형이면 zero가 char형의 '0'가 될 것이고 int 형이면 zero가 int형의 0이 되도록 하기 위해 템플릿 완전(명시적) 특화를 사용하려 하였다.
그런데 VS에서 멀쩡히 컴파일되던 녀석이 테스트 봇 - gcc를 사용한다 - 에서 컴파일이 안되어서 여기저기 알아보니 클래스 내의 Inner Class는 템플릿의 명시적 특화가 '확장이 아닌 표준을 따르면' 지원되지 않는덴다. 그래서 꼼수로 생각한게 부분특화를 사용하고 템플릿 인자에 기본인자를 사용하였더니 gcc나 VS에서 문제없이 컴파일이 되었다.
참여중인 프로젝트에서 타입리스트를 사용하여 'enum'의 사용량을 줄여보려고 시도해본적이 있었다. 그러니까, enum대신에 TL::IndexOf< T_Typlist, MyClass >::value 등의 값을 사용하려고 했었다. 이렇게 하면, 사용하려는 클래스군 - 아마, state 나 strategy pattern 들의 구현클래스들이겠지 - 이 추가될때 마나 T_Typelist 에 추가되는 클래스만 적어주면 된다.
적용을 해봤는데, 다른 분들의 반응이 영 탐탁치 않다. 아마도 익숙한 enum을 나두고 왜 굳이 생소한 타입리스트를 사용하는지에 대한 불만의 표출이었으리라.
곰곰히 자기반성을 해보니, 이건 '잘난체' 외에 아무것도 아니라는걸 느꼈다. 나에게 반문해보니 enum과 class의 중복등록이 정말 나빠서 없애려고 했던것 보다는 타입리스트를 프로젝트에서 써보고 싶었던것이 더 크게 작용한것같다. 이러한 행동은 팀워크를 깨뜨리고 분위기를 싸~ 하게 만드는, 얻는것은 없고 잃는것은 많은 '못된'짓이다.
팀은 새로운것을 즐기는 사람, 코딩보다는 결과물을 더 즐기는 사람, 익숙한것들 활용하여 문제를 해결하려는 사람등 다양한 사람들로 구성된다. 그리고 이러한 팀원들의 합동작업으로 최종 결과물이 나온다. 새로운것을 즐기는 사람이 짠 코드를 익숙한 것을 활용하여 문제를 해결하려는 사람이 유지보수를 맡게 되는 경우도 허다하다. 그래서 다른 팀원이 공감할수 없는 코드은 '못된'코드다.
다른분들에게 생소한 메타프로그래밍은, 정말로 쓰이면 크게 좋을때, 외부 노출을 최대한 적게 하여 만들어야 한다. 그리고, 메타프로그래밍을 사용했을때의 장점을 충분히 납득시켜야 한다.