• 분류 전체보기 (9)
    • Study (7)
      • CPP (4)
      • DataStructure (2)
      • Algorithm (0)
      • 기타 개발 팁 (1)
    • Diary (1)

블로그 메뉴

  • 홈
  • CPP
  • DataSturcture
  • Algorithm

공지사항

인기 글

태그

  • IT
  • CPP
  • 프로그래밍 #windows #배치파일 #윈도우 #windows #batch #command
  • 컴퓨터
  • Queue
  • C++
  • CS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
fredhur

fredhur's Tech Blog

Study/CPP

class template deduction guide

2024. 3. 6. 23:23

 

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
    'Study/CPP' 카테고리의 다른 글
    • protected destructor
    • Enum class to type ( int2Type 의 응용)
    • EnumClassToType
    fredhur
    fredhur

    티스토리툴바