사용 목적
1. 콜백 방식을 사용하기 위해 사용한다. 이는 함수 포인터를 사용하는 목적과 동일하다.
2. 내가 로직을 많이 만들었지만 사용자가 무슨 일을 할지 모를 때 콜백 방식을 사용하는 것이 유리하다.
솔직히 써본적이 많이 없어서 쓰면서 사용할 때를 많이 접해봐야겠다....
사용 예
플레이어라는 클래스에서 사용할 스킬을 지정하는 함수와 지정된 스킬을 사용하는 함수를 functional을 이용해서 구현해 보자.
#include <iostream>
#include <functional>
enum class SkillType
{
Kick,
Punch,
GlobalKick
};
void GlobalKick();
class Player
{
public:
Player();
~Player();
void ReadySkill(SkillType _Skill);
void UseSkill();
void Punch(int _Value);
void Kick(int _Value, float _Value2);
private:
SkillType CurrentSkill_;
//전달받은 함수를 보관하는 변수
//매게변수의 개수, 타입 상관x 반환 타입만 템플릿 인자에 적으면 됨(void())
std::function<void()> UsingSkill;
};
void Player::ReadySkill(SkillType _Skill)
{
switch (_Skill)
{
case SkillType::Kick:
//bind(함수의 주소,인스턴스의 주소,매게 변수 값)
UsingSkill = std::bind(&Player::Kick, this, 10,3.8f);
break;
case SkillType::Punch:
UsingSkill = std::bind(&Player::Punch, this, 5);
break;
case SkillType::GlobalKick:
//bind(함수의 주소) << 전역 함수이니 인스턴스의 주소가 필요없다
UsingSkill = std::bind(&GlobalKick);
break;
}
}
void Player::UseSkill()
{
//UsingSkill에 연결된 함수를 호출
UsingSkill();
}
void Player::Punch(int _Value)
{
std::cout << "펀치 사용 " <<_Value <<"의 데미지 !!" << std::endl;
}
void Player::Kick(int _Value,float _Value2)
{
std::cout << "킥 사용" << _Value << "의 데미지 !!" << _Value2 << "의 추가 데미지 !!" << std::endl;
}
void GlobalKick()
{
std::cout << "글로벌 킥 사용" << std::endl;
}
int main()
{
Player Bear;
Bear.ReadySkill(SkillType::Punch);
//Bear.ReadySkill(SkillType::Kick);
//Bear.ReadySkill(SkillType::GlobalKick);
Bear.UseSkill();
}
빌드 결과
1. Bear.ReadySkill(SkillType::Punch);
2.Bear.ReadySkill(SkillType::Kick);
3.Bear.ReadySkill(SkillType::GlobalKick);
'DirectX > 공부 내용' 카테고리의 다른 글
DirectX::FrameAnimation (0) | 2022.07.15 |
---|---|
DirectX:: Atlas Texture 처리 (0) | 2022.07.14 |
DirectX::GameEngineTexture & GameEngineSampler (0) | 2022.07.12 |
렌더링 파이프 라인 : ConstantBuffer (0) | 2022.07.11 |
DirectX::동차 좌표계 (0) | 2022.07.06 |