요즘은 자바를 배우고 있습니다. 자바에는 C++의 템플릿과 비슷한 제네릭(Generic)이 있는데요, 용법도 비슷합니다.

특이한 점이라면 제네릭으로 사용 가능한 클래스를 제한할 수 있는데 예를 들면,

class FruitBox<T extends Fruit> {
    //...
}

위처럼 코드를 작성하면 Fruit 클래스를 상속(또는 인터페이스를 구현)하는 타입만 FruitBox의 타입으로 들어갈 수 있습니다.

여기서 "C++도 이런게 되나?" 의문이 들었는데

#include <type_traits>

template<typename T, typename = std::enable_if<std::is_base_of<MyClass, T>::value>>
T Foo(T bar)
{
    return T();
}

C++11 이상이면 이런식으로 std::enable_if, std::is_base_of를 사용할 수 있다고 합니다.

그런데 밑에 레퍼런스를 읽어보시면 알겠지만 사실 C++ 템플릿은 컴파일 타임에 사용되는 타입으로 복붙돼서 인스턴스화 되는건데, 그러니 컴파일타임에 이런 타입체킹은 사실 의미없다는 말도 있네요.

aop 측면에서 봐도 어느정도 맞는 말 같기도..? 우연찮게 템플릿 함수 안에서 다른 타입 클래스가 들어갔는데, 우연찮게 return 타입도 갖고 파라미터도 갖고 그렇다면 이걸 걸러내는건 의미가 없지 않을까 라는 식의 의견이 써 있습니다.

재밌네요

 

Reference

반응형