언어/C++

constexpr 함수

에린_1 2024. 2. 17. 17:24
728x90

constexpr

  • C++11에 constexpr 이라는 키워드가 추가되었다.
  • constexpr은 변수 또는 함수의 값을 컴파일 시점에 도출하여 상수화 시켜주는 아주 강력한 기능이다.
  • 컴파일 시점에 상수로 처리되기 때문에 switch case 문에서도 상수로 취급된다.

constexpr을 함수에 사용할 때 제약사항

  • constexpr을 사용하는 데 있어서 몇 가지 제약사항이 있다.
    • 반환값이 무조건 Literal Type이어야 한다.
    • virtual로 재정의된 함수가 아니어야 한다.
    • 재귀 함수로 사용될 수 있다.
    • 함수에 constexpr을 붙일 경우 inline을 암시한다.
    • C++11 에서는 함수 본문에 지역변수를 둘 수 없고, 하나의 return 구문만 있어야 했다.
    • 위 제약은 C++14에서 사라졌다.

구현 예시

  • 25206 너의 평점은
#include <bits/stdc++.h>
using namespace std;

constexpr unsigned int Hash(const char* str) 
{
	return str[0] ? static_cast<unsigned int>(str[0]) + 0xEDB8832Full * Hash(str + 1) : 8603;
}

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	char grade[50];
	string subject;
	float my_grade,sum_grade=0,major_GPA=0;
	for (int i = 0; i < 20; ++i)
	{
		cin >> subject >> my_grade >> grade;
		switch (Hash(grade))
		{
		case Hash("A+"):
			sum_grade += my_grade;
			major_GPA += my_grade * 4.5;
			break;
		case Hash("A0"):
			sum_grade += my_grade;
			major_GPA += my_grade * 4.0;
			break;
		case Hash("B+"):
			sum_grade += my_grade;
			major_GPA += my_grade * 3.5;
			break;
		case Hash("B0"):
			sum_grade += my_grade;
			major_GPA += my_grade * 3.0;
			break;
		case Hash("C+"):
			sum_grade += my_grade;
			major_GPA += my_grade * 2.5;
			break;
		case Hash("C0"):
			sum_grade += my_grade;
			major_GPA += my_grade * 2.0;
			break;
		case Hash("D+"):
			sum_grade += my_grade;
			major_GPA += my_grade * 1.5;
			break;
		case Hash("D0"):
			sum_grade += my_grade;
			major_GPA += my_grade * 1.0;
			break;
		case Hash("F"):
			sum_grade += my_grade;
			major_GPA += my_grade * 0.0;
			break;
		case Hash("P"):
			break;
		default:
			break;
		}
	}
	
	cout << major_GPA/sum_grade;
	return 0;
}
728x90

'언어 > C++' 카테고리의 다른 글

정렬Sort()  (0) 2024.02.21
입력함수 : cin(), getline() and cin.ignore()  (0) 2024.02.21
String::find() 문자열에서 특수 문자 찾기  (1) 2024.02.17
삼항 연산자  (0) 2024.02.14
Vector Container  (0) 2024.02.14