작성
·
302
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
함수에 대해서 먼저 말씀을 드리고 싶은데,
우리가 함수를 사용하려면 만들어 저장을 해야합니다.
int getMax(int x, int y)
{ return (x>y)?x:y; }
이런 명확한 형태로 말이죠.
그리고 함수의 호출을 통해서 함수는 일을 합니다.
본론으로 넘어가면
Template은
Template<typename T>
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이 하는 일입니다.
그리고 나중에 'Complier가 만들어줬던 함수'(Instance)를 돌리니 문제가 발생하지 않습니다.
auto는 type을 추측을 하는 것은 같습니다만, 바로 변수로 선언하는 겁니다.
당장 만들자!
이런겁니다. 때문에 type을 추측해서 바로 정해줘야하죠.
그래서
auto x = 77; // int
auto y = 77.0; // double
로 정상적으로 선언되는 것을 볼 수 있으나,
auto x; --> error!
임을 보실 수 있죠 단서가 없기 때문에 type 을 결정할 수 없는 상황입니다.
그러면
auto getMax(auto x, auto y) { return (x>y)?x:y; }
구조를 보면, 함수의 parameter로서 왜 auto가 사용될 수 없는지 눈치 채실 수 있습니다.
x, y의 자료형을 정하지 못하여 그 함수를 만들어 낼 수 없기 때문입니다.
그럼
auto getMax(auto x=7, auto y=8) { return (x>y)?x:y; }
이건 되느냐? 이것도 안됩니다.
사실은 그냥 함수의 parameter 로서의 사용은 막아놓았습니다.
type deduction, auto에 대해서는 19.8 에서 추가적(주의사항 중점)으로 더 공부하실 수 있습니다.
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
0
0