teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

typo修正

2020/03/21 06:21

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -66,7 +66,7 @@
66
66
  > 3. この実装では長ったらしい表現(std::variant や std::visit)を書かなければいけないが、避けることはできないのか?
67
67
 
68
68
  C++は、「長ったらしい表現」をある意味推奨しているので避けることは困難と思います。
69
- マクロを多様することで隠すことはできるでしょうが、却って可読性を落とす危険もあるので使う時は要注意です。
69
+ マクロを使うことで隠すことはできるでしょうが、却って可読性を落とす危険もあるので使う時は要注意です。
70
70
 
71
71
  > 4. この実装のポリモルフィズムは実践的に問題となる点(パフォーマンスやバグ、表現力が不十分であるなど)を抱えているのか?
72
72
 

1

追記

2020/03/21 06:21

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -49,4 +49,34 @@
49
49
 
50
50
  さて、この問題は、静的型付けと動的型付けのどちらを使うかの問題と思います。
51
51
  一般に動的型付け言語は静的型付け言語に比べて、コンパイル時のバグのチェック能力が低いです。(当たり前ですが、実行に決まる型をコンパイル時にチェックすることはできませんから)
52
- ですので、大規模開発には向きません。逆に小規模開発の時は面倒な手順が少ないので便利です。
52
+ ですので、大規模開発には向きません。逆に小規模開発の時は面倒な手順が少ないので便利です。
53
+
54
+ # 追記への回答
55
+ ちんたら書いているうちに追記がありましたので、回答してみます。
56
+
57
+ > 1. 今の例のような std::variant, もしくはもっと洗練された何かを使って多重ディスパッチを実現することが可能ではないか?
58
+
59
+ お使いの機能はconceptという今正に標準規格へ取り入れることが議論されている機能です。
60
+ つまり、現時点ではもっとも洗練されている方法と思います。
61
+
62
+ > 2. この実装では 明示的に DogOrCat を作成しているが、Animal を Dog と Cat が継承しているときに、自動的にそれに対応する std::variant を生成できるのか?
63
+
64
+ 現時点では無理と思います。インクルードしているヘッダの相違でst::variantが取り込む型が変わってしまうことになるので、将来的にも対応しないような気がします。
65
+
66
+ > 3. この実装では長ったらしい表現(std::variant や std::visit)を書かなければいけないが、避けることはできないのか?
67
+
68
+ C++は、「長ったらしい表現」をある意味推奨しているので避けることは困難と思います。
69
+ マクロを多様することで隠すことはできるでしょうが、却って可読性を落とす危険もあるので使う時は要注意です。
70
+
71
+ > 4. この実装のポリモルフィズムは実践的に問題となる点(パフォーマンスやバグ、表現力が不十分であるなど)を抱えているのか?
72
+
73
+ 私に分かる範囲では無いように感じます。今、標準規格を制定する人たちが深い議論を進めている筈です。彼らが採用と決定したら、安心して使っても、まず大丈夫だろうと思います。
74
+
75
+ > 5. 上記の点が全てクリアされているならば、Julia と同じぐらいの表現力で多重ディスパッチ可能であると言えるのではないか?
76
+
77
+ 全てを完全にクリアできるとは思えないですが、多重ディスパッチ可能と言える程度にはクリアできているように感じます。
78
+
79
+ > 6. そうであるならばもとの Julia の文章はこの方式によるポリモルフィズムを想定していない or 不適切であるということになるのではないか?
80
+
81
+ その通りと思います。
82
+ 動的型付け言語は自由度が高いですから、そのような実装は得意です。その代わり、バグ検出能力を犠牲にします。ですので、簡単にプログラムできることを取るのか、大規模プログラムを開発できることを取るのかの選択となります。どちらが優れているという話ではなく、どのようなプログラム開発に向いているのかという話です。