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;
}