🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

13.4 클래스 맴버 함수 특수화

20.05.07 12:04 작성 조회수 206

4

다름이 아니라 수업을 듣다가 auto라는 변수선언 하는 방식이랑 Templete를 사용하는 방식의 차이가 갑자기 궁금해서 물어보게 되었습니다.

물론 차이가 있다는걸 알지만 좀더 명확하게 알려 주실수 있는지 확인하고 싶어서 남겼습니다.

ex)

template<typename T>

T getMax(T x, T y)

{

return (x > y) ? x : y;

}

은 되지만

auto getMax(auto x, auto y)

{

return (x > y) ? x : y;

}

는 안되는걸로 아는데 혹시 다른 부분에 있어서 안되는것이 있는지 궁금해서 질문 남겨드립니다.

답변 4

·

답변을 작성해보세요.

8

Hello Yeo님의 프로필

Hello Yeo

2020.05.07

함수에 대해서 먼저 말씀을 드리고 싶은데,<o:p></o:p>

우리가 함수를 사용하려면 만들어 저장을 해야합니다.<o:p></o:p>

int getMax(int x, int y)<o:p></o:p>

{ return (x>y)?x:y; }<o:p></o:p>

이런 명확한 형태로 말이죠.<o:p></o:p>

그리고 함수의 호출을 통해서 함수는 일을 합니다.<o:p></o:p>

 <o:p></o:p>

본론으로 넘어가면


<o:p></o:p>

Template<o:p></o:p>

Template<typename T><o:p></o:p>

T getMax(T x, T y) { return (x>y)?x:y; } 

 선언하면 이것 자체로는 아무런 일도 하지 않습니다

내가 이러한 일을 앞으로  예정인데필요할  맞는 걸로 만들어줘! 

라는 예고입니다

Complietime getMax 사용된 위치를 찾고 어떤 type 변수가 사용되었는지

 확인하여 해당 type 함수를 만들어내는 방식입니다.

int가 들어왔네? int getMax(int, x, int y)…. 라는 함수를 만들어주는거죠. (Instantiation)

이게 function template 하는 일입니다.
<o:p></o:p>

그리고 나중에 'Complier 만들어줬던 함수'(Instance)를 돌리니 문제가 발생하지 않습니다.


<o:p></o:p>

auto type 추측을 하는 것은 같습니다만바로 변수로 선언하는 겁니다

당장 만들자! 

이런겁니다때문에 type 추측해서 바로 정해줘야하죠.<o:p></o:p>

그래서

auto x = 77;  // int<o:p></o:p>

auto y = 77.0; // double<o:p></o:p>

 정상적으로 선언되는 것을   있으나,<o:p></o:p>

auto x; --> error!
임을 보실  있죠 단서가 없기 때문에 type 을 결정할 수 없는 상황입니다.

그러면<o:p></o:p>

auto getMax(auto x, auto y) { return (x>y)?x:y; }<o:p></o:p>

구조를 보면함수의 parameter로서  auto 사용될  없는지 눈치 채실  있습니다

x, y의 자료형을 정하지 못하여  함수를 만들어   없기 때문입니다.

그럼

auto getMax(auto x=7, auto y=8) { return (x>y)?x:y; }<o:p></o:p>

이건 되느냐이것도 안됩니다

사실은 그냥 함수의 parameter 로서의 사용은 막아놓았습니다.

type deduction, auto
 대해서는 19.8 에서 추가적(주의사항 중점)으로  공부하실  있습니다.

<o:p></o:p>

 since C++14

-  return type auto 사용하실  있습니다.
    auto getMax(int x, int y)
    { return (x>y)?x:y;) }  ==> Works!


이것저것 보면서 느낀 점이 있는데 지금 이렇게 뭔가 법칙처럼 적어놓았지만 안의 논리들은 사람들이 만들어 놓았고과학 법칙처럼 정해진 것이 아니라는 것이죠언제든지 크고 작게 변할 수 있다는 것입니다.
C++14 
부터 return에 auto를 쓸 수 있다는 것만 보아도 그렇습니다.

https://en.cppreference.com/w/cpp/language/auto

https://docs.oracle.com/cd/E19205-01/819-5267/bkafi/index.html

https://en.cppreference.com/w/cpp/language/class_template_argument_deduction

https://en.cppreference.com/w/cpp/language/function_template

글을 적는동안 몇몇 참고한 자료들입니다. 열어보시기만이라도 하시길 권장합니다. 도움이 되었길...

1

한 번 쯤 생각해볼만한 질문입니다. template과 type deduction의 기능이 같다면 같은 문법이 두 가지가 있을 필요가 없겠지요.

0

홍길동님의 프로필

홍길동

2021.01.07

저도 궁금했는데 도움이 되네요!

0

김기상님의 프로필

김기상

질문자

2020.05.07

감사합니다!

채널톡 아이콘