class template 을 이용하여 생성자를 만들때 가이드를 주어 어떤 생성자를 사용할지 알게 하는 문법이다.
생성자를 '추론' 할 수 있게 도와준다고 하여 deduction guide 라고 하는 것 같다.
아래 코드를 참고해보자.
#include <cstdio>
#include <vector>
using namespace std;
template <typename T>
class MyDB
{
public:
MyDB() = default;
template <typename Container>
MyDB(const Container& c)
{
// some implementation here
}
private:
};
int main()
{
vector<int> v = {1,2,3,4};
MyDB my(v);
return 0;
}
MyDB class 의 의도는 생성할때 임의의 Container 를 담아 거기에 있는 원소들을 MyDB 에 저장하려는 것이다.
근데 위 코드를 컴파일 해보면 에러이다.
에러로그는 아래처럼 나온다.
No viable constructor or deduction guide for deduction of template arguments of 'MyDB'
MyDB 의 생성자를 추론 하기 위한 가이드가 없고, 할만한 생성자도 없다고 한다.
이제 deduction guide 를 줘보자. 아래처럼 작성하면 된다.
#include <cstdio>
#include <vector>
using namespace std;
template <typename T>
class MyDB
{
public:
MyDB() = default;
template <typename Container>
MyDB(const Container& c)
{
// some implementation here
}
private:
};
template <typename Container>
MyDB(const Container &c) -> MyDB<typename Container::value_type>;
int main()
{
vector<int> v = {1,2,3,4};
MyDB my(v);
return 0;
}
핵심은 아래 코드이다.
template <typename Container>
MyDB(const Container &c) -> MyDB<typename Container::value_type>;
-> 를 통해 위와 같은 생성자가 오게되면 이때 타입을 typename Container::value_type 으로 추론해서 생성해달라는 코드다.
이때 내가 주려는 Container 는 템플릿 의존적이라서 어떤 타입이 올지 모르는데, STL 은 이럴때를 위해 value_type 을 내부에 정의하여 사용한다. 이 예제의 경우 value_type = int 로 되어있을 것이다.
프로그래밍 공부하다가 apple clang 이 어떻게 priority_queue 를 구현했는지 궁금해서 확인했는데 위와 같은 템플릿 추론 가이드 코드가 많이 있었음을 확인했다. 상당히 다양한 기법으로 활용되는 예제이니 알아두는것이 좋다.
'Study > CPP' 카테고리의 다른 글
| protected destructor (0) | 2024.02.25 |
|---|---|
| Enum class to type ( int2Type 의 응용) (0) | 2022.11.02 |
| EnumClassToType (0) | 2022.09.12 |