ã¢ãã³ç¬¬7ç« ïŒãC++17ãçŸä»£çåã·ã¹ãã ãšãŒããªãŒããŒãããæœè±¡å
std::optional, std::variant, constexpr ã«ããæ¥µéã®åå®å
šæ§ãšè¶
é«éãã£ã¹ããã
C++03ãŸã§ã®æ§æ¥èšèšã§ã¯ããå€ãååšããªããããšã衚ãããã«NULLãã€ã³ã¿ãããžãã¯ãã³ããŒïŒ-1ãªã©ïŒãè¿ããå®è¡æã¯ã©ãã·ã¥ã®åå ãšãªã£ãŠããŸããããŸãã倿§ãªã¢ã€ãã ãæµã®çš®å¥åå²ã«ã¯éãRTTIïŒdynamic_castïŒã巚倧ãªswitchæã䜿ãããŠããŸãããC++17ã§å°å
¥ããã std::optionalïŒå€ã®æç¡ã®åå®å
šè¡šçŸïŒãstd::variant + std::visitïŒä»®æ³é¢æ°ããŒãã«äžèŠã®è¶
é«éãã¿ãŒã³ãããã³ã°ïŒããããŠã³ã³ãã€ã«æèšç®ã® constexpr ãæŽ»çšããå®å
šãã€æ¥µéãŸã§é«éãªæ°äžä»£ã®ã²ãŒã ã¢ãŒããã¯ãã£ãæ§ç¯ããŸãã
M4.1 ãã«ãã€ã³ã¿ã¯ã©ãã·ã¥ãæ²æ»
ãã std::optional
ããã€ã³ã¿ãNULLãã©ããã®ãã§ãã¯å¿ããã«ããå®è¡æåŒ·å¶çµäºã«çµæ¢ç¬ŠïŒæ»ãå€ã«ãå€ãååšããªãå¯èœæ§ããåãšããŠæç€ºããã¢ãã³C++ã®æšæºèŠåŸãåŠã³ãŸãã
ð§ ãã³ã®ã³å
茩
ãã³å
çïŒèªæ©ã®èªå远尟ã¬ãŒããŒã§ãæãè¿ãæµããæ¢ã颿°ãäœã£ããã§ãããç»é¢äžã«æµã1äœãããªãæã« NULL ãã€ã³ã¿ãè¿ããããåŒã³åºãåŽã§ãã§ãã¯ãå¿ããŠå³åº§ã«ã¬ããœïŒNullPointerExceptionïŒã§ã²ãŒã ãèœã¡ãŸããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¬ããïŒã²ãŒã éçºè
ã®ç»ç«éãNULLãã€ã³ã¿äºæ
ããããªïŒCèšèªãå€å
žC++ã§ã¯ãå€ããªããããšã衚ãããã«ãã€ã³ã¿ã䜿ããããåŸããåŒã³åºãåŽãNULLãã§ãã¯ã匷å¶ãããªãã®ãæå€§ã®æ¬ é¥ããã£ãã
ð§ ãã³ã®ã³å
茩
ããã€ã³ã¿ãããªãæ®éã®ãªããžã§ã¯ãããè¿ãããšãããšãæµãããªãæã«äœãè¿ãã°ãããå°ããã§ãããããããŒã®åº§æšïŒ-9999, -9999ïŒãè¿ãã®ããã°ã®ããšã§ããâŠâŠã
ð»ââïž ã·ãã¯ãå
ç
ããã§C++17ã®è³å®ãstd::optional<T>ãããïŒãå€ããããããããªããã空ã£ãœãããããªãããšããç¶æ
ãã®ãã®ãåãšããŠæç€ºããããŒãã¢ãã±ãŒã·ã§ã³ãªãã§å®å
šã«åãåºããåªããã®ãªããããïŒ
M4.2 dynamic_cast ãš switch ãè¬ã std::variant + std::visit
ä»®æ³é¢æ°ããŒãã«ïŒvtableïŒã®ãªãŒããŒãããããããŒã確ä¿ãäžèŠïŒéçåå®å
šãªTagged Unionãšãã¿ãŒã³ãããã³ã°ã«ããæ°æä»£ã®é«é倿
æ§ãåŠã³ãŸãã
ð§ ãã³ã®ã³å
茩
å
çã第4ç« ã§ããªã¢ãŒãã£ãºã ãç¿ããŸããããããããã¢ã€ãã ïŒæ»æåUPã»ããªã¢ã»å
šäœãã ïŒã¿ãããªãåºå®ã®æ°çš®é¡ãããªãããŒã¿ããŸã§å
šéš `virtual void apply()` ã®ç¶æ¿ã¯ã©ã¹ã«ããã®ã£ãŠãå°ã倧ãããªæ°ããããã§ãã
ð»ââïž ã·ãã¯ãå
ç
ããã£ãèŠäºãªæŽå¯åããïŒç¶æ¿ãšä»®æ³é¢æ°ã¯ãå°æ¥ã©ããªæŽŸçã¯ã©ã¹ãå¢ãããåãããªããæã«ã¯åŒ·åããããvtableã®ãã€ã³ã¿éæ¥åç
§ãšããŒãã¢ãã±ãŒã·ã§ã³ïŒunique_ptrïŒã®ã³ã¹ããå¿
ãçºçããã
ð§ ãã³ã®ã³å
茩
Cèšèªã® `union`ïŒå
±çšäœïŒãªãã¡ã¢ãªã¯1ç®æã§æžã¿ãŸããã©ãã©ã®åãå
¥ã£ãŠãããåãããªããªã£ãŠå±ãªãã§ãããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ããã§ç»å Žããã®ãC++17ã®æçµå
µåšãstd::variantããšãstd::visitãããïŒãåå®å
šãªå
±çšäœïŒTagged UnionïŒãã§ãããããŒã確ä¿ãä»®æ³é¢æ°ããŒãã«ãäžåãªãã«ãå
šçš®é¡ã®åŠçãã³ã³ãã€ã«æç¶²çŸ
æ§ãã§ãã¯ä»ãã§å®è¡ã§ããããããïŒ
M4.3 constexpr ãš std::visit ã«ããå®å
šå®æŠã³ãŒã
ã³ã³ãã€ã«æå®æ°ããŒãã«ãš std::variant ãçµã¿åãããã²ãŒã ã®ã¢ã€ãã 广é©çšããžãã¯ããŒããªãŒããŒãããã§çµã¿äžããŸãã
ð§ ãã³ã®ã³å
茩
å
çïŒ`std::variant` ãš `std::visit` ã䜿ããšãã©ã ãåŒã®ãªãŒããŒããŒãã䜿ã£ãŠããã¯ãŒã¢ãããªã匟æ°+1ããããªã¢ãªãã·ãŒã«ãå埩ãã£ãŠãã¡ããã¡ã綺éºã«æžããŸããïŒ
ð»ââïž ã·ãã¯ãå
ç
ããããïŒãããããå°æ¥ãæ°ããã¢ã€ãã åãã远å ããŠåŠçãæžãå¿ããããã³ã³ãã€ã©ããåãç¶²çŸ
ãããŠããããïŒããšãã«ããšã©ãŒã§æããŠãããããããã¢ãã³C++ã®ããŒãã³ã¹ããã€ã³ã³ãã€ã«æå®å
šæ§ãã®æ¥µèŽãªãããïŒ
ð ModernItems.h
#pragma once
#include <variant>
#include <iostream>
#include <string_view>
// 1. åã¢ã€ãã ã¯ã·ã³ãã«ãªå€æ§é äœïŒç¶æ¿ãä»®æ³é¢æ°ãäžèŠïŒïŒ
struct PowerUpItem {
int extraBullets = 1;
};
struct ShieldItem {
int repairAmount = 2;
};
struct BombItem {
float blastRadius = 5.0f;
};
// 2. ã¢ã€ãã ã®çš®é¡ã std::variant ã§å®çŸ©ïŒåå®å
šãªå
±çšäœïŒ
using ItemData = std::variant<PowerUpItem, ShieldItem, BombItem>;
// 3. è€æ°ã®ã©ã ãåŒãå€éç¶æ¿ããŠãªãŒããŒããŒã颿°ãªããžã§ã¯ããäœãã¢ãã³ã€ãã£ãªã
template<class... Ts>
struct Overloaded : Ts... { using Ts::operator()...; };
template<class... Ts>
Overloaded(Ts...) -> Overloaded<Ts...>;
// 4. constexpr ã«ããã³ã³ãã€ã«æäºåèšç®ïŒå®è¡æã³ã¹ãå®å
šãŒãïŒïŒ
constexpr int kMaxItemSlots = 8;
constexpr float kItemFallSpeed = 1.5f;
// ã³ã³ãã€ã«æã«èšç®ãããã¹ããŒãžåæå宿°
constexpr int calculateInitialBonus(int stage) {
return stage * 500 + 1000;
}
ð GamePlay.cpp
#include "ModernItems.h"
#include <vector>
class PlayerShip {
public:
int bullets = 1;
int shield = 3;
void addScore(int s) {}
void triggerScreenBomb(float radius) {}
};
// ã¢ã€ãã ååŸã€ãã³ãã®ãã£ã¹ãããåŠç
void applyItemEffect(PlayerShip& player, const ItemData& item) {
// std::visit ã«ãããçŸåšå
¥ã£ãŠããåã«å¯Ÿå¿ããã©ã ããè¶
é«éã«çŽåŒã³åºããããïŒ
// ä»®æ³é¢æ°ããŒãã«ã®åç
§ãããã£ã¹ããäžåäžèŠïŒ
std::visit(Overloaded {
[&](const PowerUpItem& p) {
player.bullets += p.extraBullets;
std::cout << "ð ãã¯ãŒã¢ããïŒæå€§åŒŸæ°: " << player.bullets << std::endl;
},
[&](const ShieldItem& s) {
player.shield += s.repairAmount;
std::cout << "ð¡ïž ã·ãŒã«ãä¿®åŸ©ïŒæ®é: " << player.shield << std::endl;
},
[&](const BombItem& b) {
player.triggerScreenBomb(b.blastRadius);
std::cout << "ð¥ å
šç»é¢ãã çºåïŒååŸ: " << b.blastRadius << std::endl;
}
}, item);
}
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. std::optional<T> ããå€ãæããªã空ã®ç¶æ
ãã§ããããšã衚ããC++17æšæºã®å®æ°ã¯ã©ãã§ããïŒ
- 1. NULL
- 2. nullptr
- 3. std::nullopt
- 4. std::none
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒstd::nullopt
std::optional ã®ç¡å¹ç¶æ
ïŒç©ºïŒãæç€ºããã«ã¯ std::nullopt ã䜿çšããŸããããã«ããããã€ã³ã¿ã® nullptr ãæŽæ°ã® -1 ãªã©ã®ããžãã¯ãã³ããŒã«é Œãããåå®å
šã«ãå€ã®äžåšããæ±ããŸãã
Q2. C++17ã® std::variant ããå€å
žç㪠Cèšèªã® union ãåºåºãã€ã³ã¿ã® dynamic_cast ãããåªããŠããæå€§ã®çç±ã¯äœã§ããïŒ
- 1. å
éšã§èªåçã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒGCïŒãåããã
- 2. åå®å
šïŒçŸåšä¿æããŠããåãå³å¯ã«è¿œè·¡ããã¹ãã©ã¯ã¿ãåŒã¶ïŒã§ãããããŒã確ä¿ãvtableãªãã§åäœãããã
- 3. ãã«ãã¹ã¬ããéã§èªåçã«æä»ããã¯ïŒmutexïŒãååŸãããã
- 4. ã³ã³ãã€ã«ãäžèŠã«ãªãã¹ã¯ãªããæ©èœã ãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒåå®å
šïŒçŸåšä¿æããŠããåãå³å¯ã«è¿œè·¡ããã¹ãã©ã¯ã¿ãåŒã¶ïŒã§ãããããŒã確ä¿ãvtableãªãã§åäœãããã
std::variant ã¯ãåå®å
šãªå
±çšäœïŒTagged UnionïŒãã§ãããå€å
žç㪠union ã®ãããªååãéãã«ããã¡ã¢ãªç Žå£ãé²ãããã€ç¶æ¿ããªã¢ãŒãã£ãºã ã®ãããªããŒãå²ãåœãŠãä»®æ³é¢æ°ããŒãã«ïŒvtableïŒãã€ã³ã¿ãå¿
èŠãšããŸããã
Q3. std::variant ã«æ ŒçŽãããå®åã®åŠçãè¡ãéãstd::visit ã«è€æ°ã®ã©ã ãåŒãçµåããŠæž¡ãã¢ãã³ã€ãã£ãªã ã®åç§°ã¯ã©ãã§ããïŒ
- 1. Overloaded ãã¿ãŒã³ïŒãªãŒããŒããŒãæ§é äœïŒ
- 2. Singleton ãã¿ãŒã³
- 3. Proxy ãã¿ãŒã³
- 4. Pimpl ã€ãã£ãªã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒOverloaded ãã¿ãŒã³ïŒãªãŒããŒããŒãæ§é äœïŒ
è€æ°ã®ã©ã ãåŒãå€éç¶æ¿ã㊠using Ts::operator()... ã§ãªãŒããŒããŒã解決ããããã¯ããã¯ã¯ãOverloaded ãã¿ãŒã³ããšåŒã°ããC++17ã® std::visit ãšçµã¿åãããŠæãåºã䜿ãããå
¬åŒã€ãã£ãªã ã§ãã
Q4. 颿°ã倿°ã« constexpr ãä»äžããæå€§ã®ã¡ãªããã¯äœã§ããïŒ
- 1. ã¡ã¢ãªãå¿
ãããŒããã£ã¹ã¯ïŒSSDïŒã«æžã蟌ããã黿ºãåããŠãå®å
š
- 2. ã³ã³ãã€ã«æã«èšç®ãå®äºãããããããã°ã©ã å®è¡æã®CPUè² è·ãšã¬ã€ãã³ã·ãå®å
šã«ãŒãã«ãªã
- 3. ããã°ã©ã ã®ãã€ããªãµã€ãºãèªåçã«ååã«ãªã
- 4. äŸå€åŠçã® try-catch ãäžèŠã«ãªã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒã³ã³ãã€ã«æã«èšç®ãå®äºãããããããã°ã©ã å®è¡æã®CPUè² è·ãšã¬ã€ãã³ã·ãå®å
šã«ãŒãã«ãªã
constexpr ã¯ã宿°åŒïŒConstant ExpressionïŒããæå³ããã³ã³ãã€ã©ããã«ãæã«åŒã®å€ãèšç®ããŠãã€ããªã«å®æ°ãšããŠåã蟌ã¿ãŸããããã«ãããã²ãŒã å®è¡æã®èšç®è² è·ãåæåã®é
å»¶ããŒãã«ãªããŸãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â