[C++] C++20 찍먹 Concepts

2021. 8. 28. 00:12
728x90

C++20부터 적용된 기능인 Concept에 대해서 아주아주 간단하게 알아보자. Concept는 Template을 이용할 때 Compile-time에 Template에서 의도치 않는 연산을 방지해주는 기능이다. 아직은 많이 사용되는 기능이 아니라 많이 소극적으로 사용을 하되 표준화과 되면 적극적인 사용을 하라고 권하고 싶다. 

 

 

Concepts

 

Concept은 Template에 의도한 연산을 방지해주는 기능이다. 예를 들면 아래와 같은 코드가 있다고 하자. 

 

template <typename T>
T mulTwo(T a, T b)
{
    return a + b;
}

 

위와 같은 template함수가 있다면 Template함수를 만든 개발자는 +연산이 가능한 integer나 double의 연산을 하기 위해 만들었다. 하지만 다른 사람이 이 함수를 보고 std::string객체를 넘겨서 두 문자열이 합쳐지는 기능으로 사용됐다고 생각하면 개발자의 의도가 아닌 다른 방향으로 사용이 되게 된다. 아무리 주석을 이용해서 사용했으면 하는 Data Type을 써놓아도 방지가 어렵기 때문에 뒤에 require 키워드를 통해서 사용 가능한 Type을 적어주고 Compile-time에 검사를 하는 방법으로 해당 문제를 방지할 수 있다. 

 

아래 코드는 concept의 사용법과 Template Function에 require을 통해서 사용 가능한 type을 명시해주는 예이다.

#include <iostream>
#include <concept>

template<typename T>
concept type_that_can_be_used = std::integral<T> || std::floating_point<T>;		//integer Type, float Type만 사용이 가능하게 만든 concept


template<typename T>
T mulTwo(T a, T b)
{
	return a + b;
}


int main()
{
	std::cout << mulTwo(1, 2) << '\n';
	std::cout << mulTwo(1.2f, 1.5f) << '\n';
	std::cout << mulTwo<std::string>("Hi~", " pretending");	

}

 

위 코드는 concept를 만들어 주었지만 Template Function에서 requires키워드를 통해 concept를 불러오지 않았다. 그렇기 때문에 위 코드는 컴파일이 정상적으로 진행된다. 

 

#include <iostream>
#include <concept>

template<typename T>
concept type_that_can_be_used = std::integral<T> || std::floating_point<T>;		//integer Type, float Type만 사용이 가능하게 만든 concept


template<typename T>
T mulTwo(T a, T b) requires type_that_can_be_used<T>
{
	return a + b;
}


int main()
{
	std::cout << mulTwo(1, 2) << '\n';
	std::cout << mulTwo(1.2f, 1.5f) << '\n';
	//std::cout << mulTwo<std::string>("Hi~", " pretending");	 ERROR

}

 

위와 같이 requires를 통해 만들어준 concept을 적어주면 Compile-time에 std::string은 ERROR가 나게 해 준다. concet을 선언할 때는 concpet이름과 뒤에 concept 라이브러리에 있는 Sepcifier를 이용해야 하는데 엄청 많다. 

더 많으니 cppreference를 참고하기 바란다. 

 

 

concept 간단하게 알아보고 자세히 알아보고 싶다면 아래 cppreference를 참고하기 바란다. 

 

 

Ref.

https://en.cppreference.com/w/cpp/concepts

https://www.youtube.com/watch?v=phZbmGNGqew&list=PLDV-cCQnUlIb2oezNpNTmxiiX_NibMrlO&index=6&t=329s 

 

+ Recent posts