이 글에서는 C++ STL의 std::is_void 템플릿이 어떻게 동작하는지, 그리고 문법과 실제 활용 예제를 자세히 살펴보겠습니다.
is_void는 <type_traits> 헤더 파일에 정의된 템플릿으로, 주어진 타입 T가 void 타입인지 여부를 컴파일 시점에 판별하는 데 사용됩니다.
C++에서 void 타입이란?
간단히 말해 void는 '비어 있음', 즉 '아무것도 없음'을 의미합니다. 함수를 void로 선언하면 해당 함수가 아무 값도 반환하지 않는다는 것을 나타냅니다.
또한 void 포인터(void pointer)도 선언할 수 있습니다. void 포인터는 가리키는 대상의 타입이 지정되지 않은 포인터입니다. 단, 역참조하기 전에는 반드시 다른 구체적인 타입의 변수로 형변환하여 참조해야 합니다. void 포인터는 타입에 관계없이 어떤 객체든 가리킬 수 있기 때문에 프로그래머에게 매우 유용한 도구입니다.
문법
template <class T> is_void;
매개변수
이 템플릿은 타입 T 하나만을 매개변수로 받으며, 해당 타입 T가 void 타입인지 검사합니다.
반환 값
불리언(Boolean) 값을 반환합니다. 주어진 타입이 void 타입이면 true, 그렇지 않으면 false를 반환합니다.
예제 1
Input: is_void<void>::value; Output: True Input: is_void<int>::value; Output: False
예제 2
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "checking for is_void:";
cout << "\nvoid:" << is_void<void>::value;
cout << "\nconst void:" << is_void<const void>::value;
cout << "\nint:" << is_void<int>::value;
cout << "\nchar:" << is_void<char>::value;
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
checking for is_void: void: true const void: true int: false char: false
위 결과에서 알 수 있듯이 void와 const void는 모두 true로 판별됩니다. 즉, cv 한정자(const, volatile)가 붙어도 근본 타입이 void라면 true를 반환합니다.
예제 3
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "checking for is_void:";
cout << "\nDouble:" << is_void<double>::value;
cout << "\nFloat:" << is_void<float>::value;
cout << "\nvolatile void:" << is_void<volatile void>::value;
cout << "\nconst volatile void:" << is_void<const volatile void>::value;
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
checking for is_void: double: false float: false volatile void: true const volatile void: true
마무리
std::is_void는 템플릿 메타프로그래밍에서 특정 타입이 void인지 조건부로 처리해야 할 때 유용하게 활용됩니다. ::value 멤버를 통해 불리언 결과를 얻을 수 있으며, C++17부터는 is_void_v<T> 변수 템플릿을 사용해 더욱 간결하게 작성할 수도 있습니다.