카테고리 없음

C++ 17 any

chogyujin 2023. 9. 11. 19:00
728x90

1. 개요

오늘은 C++ 17버전에서 새로 나온 any에 대해서 알아보겠습니다.


2. any?

any는 타입으로 any 앞에 오는 변수는 어떠한 값이라도 저장할 수 있는 타입입니다.

예시를 보겠습니다.

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


int main()
{
	any a = 123;
	cout << any_cast<int>(a)<<'\n';
	a = 1.234;
	cout << any_cast<double>(a) << '\n';
	a = true;
	cout << any_cast<bool>(a) << '\n';
	if (a.has_value())
		cout << "값 존재";
	return 0;
}

any는 any 헤더 파일을 추가하여 가져 와야 합니다.

any를 정의하고 a에 123을 넣었습니다.

하지만 any타입에 정의된 값을 사용할려면 any_cast를 통해 참조를 해줘야 합니다.

또한, any타입은 has_value라는 함수가 있어 안에 값이 있는지 없는지 확인이 가능합니다.

any a = 123;
int b = any_cast<int>(a);

이런것도 가능

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


int main()
{
	any a;
	if (!a.has_value())
		cout << "값 없음";
	else
		cout << "값 존재";
	return 0;
}


3. auto vs any

any가 어떤 타입이라도 저장할수 있는 객체입니다.

그런데 어디서 많이 봤던 키워드가 있죠? auto입니다.

둘다 편의를 위해 타입을 추론하는 경향이지만 약간 다릅니다.

any는 any_cast를 통해 직접 casting하여 객체나 값을 불러오는 반면 auto 는 바로 그 객체나 변수로 활용이 가능합니다.

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

class A
{
public:
	int a;
	int b;
	A() :a(5), b(6){}
	int geta()const
	{
		return a;
	}
	int getb()const
	{
		return b;
	}
};
int main()
{
	auto *c = new A();
	any a = new A();
	cout << c->geta()<<'\n';
	cout << any_cast<A*>(a)->geta()<<'\n';
	delete c;
	
	return 0;
}

그리고 또한 auto는 객체를 동적 할당하기 위해 *를 붙여주지만

any는 그러한 작업이 필요가 없습니다.

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

class A
{
public:
	int a;
	int b;
	A() :a(5), b(6)
	{
		cout << "생성자 호출" << '\n';
	}
	A(const A& other)
	{
		cout << "복사 생성자 호출" << '\n';
	}
	A(A &&other)
	{
		cout << "이동 생성자 호출" << '\n';
	}
	int geta()const
	{
		return a;
	}
	int getb()const
	{
		return b;
	}
};
int main()
{
	auto* c(new A());
	any a(new A());
	cout << c->geta()<<'\n';
	cout << any_cast<A*>(a)->geta()<<'\n';
	delete c;
	
	return 0;
}