헤더파일

c++ Trivial 본문

C++

c++ Trivial

헤더파일 2020. 3. 19. 14:24

Trivial은 쓸모가 없는 이라는 뜻입니다.

 

is_trivial_*<>::value 를 통해 해당 타입의 생성자, 복사생성자가 유효한지 확인할 수 있습니다.

 

 

  
#include <iostream>
#include <type_traits>
using namespace std;

class A
{
public:
	virtual void foo() {}
};

int main()
{
	cout << is_trivially_constructible<A>::value << endl; // 0
}

위의 코드는 생성자가 아무일도 안하는 것처럼 보이지만 가상함수가 존재하므로 가상함수 테이블을 초기화 하기 때문에 0이 출력됩니다.

 

class A
{
 public:
    	A(){}

}

이렇게 사용자가 생성자를 만든 경우에도 0가 반환됩니다. 기반 클래스가 생성자가 있는 경우도 해당됩니다.

 

template<typename T> void copy_type(T* dst, T* arc, int sz)
{
	if (is_trivially_copyable<T>::value)
	{
		cout << "복사 생성자가 trivial" << endl;
		memcpy(dst, src, sizeof(T)*sz);
	}
	else
	{
		cout << "복사 생성자가 trivial 하지 않은 경우" << endl;
		while (sz--)
		{
			new(dst) T(*src);
			++dst, ++src;
		}
	}
}

위와같이 작성한다면 타입이 복사생성자가 있는지 확인하여 깊은 복사가 필요한 복사생성자가 있는 경우 else문에 따라 복사됩니다.

 

template<typename T> 
typename enable_if< is_trivially_copyable<T>::value>::type
copy_type(T* dst, T* src, int sz)
{
		cout << "복사 생성자가 trivial" << endl;
		memcpy(dst, src, sizeof(T)*sz);
}

template<typename T> 
typename enable_if<!is_trivially_copyable<T>::value>::type
copy_type(T* dst, T* src, int sz)
{
	cout << "복사 생성자가 trivial X" << endl;
	while (sz--)
	{
		new(dst) T(*src);
		++dst, ++src;
	}
}

템플릿을 사용하면 위와 같이 나눌 수 있습니다. enable_if문은 해당 조건에 따라 불릴 함수를 제어할 수 있습니다.

'C++' 카테고리의 다른 글

c++ 변환 연산자, 변환 생성자  (0) 2020.03.23
C++17 if 초기화, if constexpr, 구조체 바인딩  (1) 2020.03.23
C++ name mangling  (0) 2020.03.11
C++ 상수 멤버 함수 operator new 재정의  (0) 2020.03.11
C++ 멤버함수  (0) 2020.03.09
Comments