요즘은 자바를 배우고 있습니다. 자바에는 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
반응형
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 전처리기 #, ## 연산자 (0) | 2022.10.09 |
---|---|
[C++] 매크로 do {...} while (0) 용도 (0) | 2022.10.09 |
[C++] Array to Pointer Decay (0) | 2021.01.29 |
[C++17] std::any에 대해 (0) | 2020.10.03 |
Visual studio Google Test 사용 예제 (0) | 2020.08.09 |