質問編集履歴

1

追記4。

2020/03/21 05:19

投稿

Paalon
Paalon

スコア266

test CHANGED
File without changes
test CHANGED
@@ -367,3 +367,133 @@
367
367
 
368
368
 
369
369
  ということなんでしょうか?
370
+
371
+
372
+
373
+ ---
374
+
375
+
376
+
377
+ ** 追記4 **:
378
+
379
+
380
+
381
+ Julia だと確かに以下のように `if ... else ..` を使ったものでもそうでなくてもコンパイルされた機械語は全く同じです。
382
+
383
+
384
+
385
+ ```julia
386
+
387
+ mutable struct Dog end
388
+
389
+ mutable struct Cat end
390
+
391
+ foo(::Dog) = println("Dog")
392
+
393
+ foo(::Cat) = println("Cat")
394
+
395
+
396
+
397
+ t = 0
398
+
399
+ a = if t == 0 Dog() else Cat() end
400
+
401
+ b = Dog()
402
+
403
+
404
+
405
+ @code_native foo(a)
406
+
407
+ @code_native foo(b)
408
+
409
+ ```
410
+
411
+
412
+
413
+ ただ C++ でも等価な機械語になるかどうかは分かりませんが、`if ... else ...` を使ったコードは以下のように書けますよね?
414
+
415
+
416
+
417
+ ```cpp
418
+
419
+ #include <iostream>
420
+
421
+ #include <variant>
422
+
423
+
424
+
425
+ struct Dog {};
426
+
427
+ struct Cat {};
428
+
429
+ using DogOrCat = std::variant<Dog, Cat>;
430
+
431
+
432
+
433
+ auto foo(Dog const &) {
434
+
435
+ std::cout << "Dog" << std::endl;
436
+
437
+ }
438
+
439
+ auto foo(Cat const &) {
440
+
441
+ std::cout << "Cat" << std::endl;
442
+
443
+ }
444
+
445
+
446
+
447
+ int main() {
448
+
449
+ auto t = 0;
450
+
451
+ auto a = [&] () {
452
+
453
+ if (t == 0) {
454
+
455
+ return DogOrCat(Dog());
456
+
457
+ }
458
+
459
+ return DogOrCat(Cat());
460
+
461
+ } ();
462
+
463
+ std::visit(
464
+
465
+ [] (auto const & x) {
466
+
467
+ foo(x);
468
+
469
+ },
470
+
471
+ a
472
+
473
+ );
474
+
475
+ }
476
+
477
+ ```
478
+
479
+
480
+
481
+ 仮想関数テーブルによりシングルディスパッチが可能であることは理解しています。質問はそこではなくて、
482
+
483
+
484
+
485
+ 1. 今の例のような `std::variant`, もしくはもっと洗練された何かを使って多重ディスパッチを実現することが可能ではないか?
486
+
487
+ 2. この実装では 明示的に `DogOrCat` を作成しているが、`Animal` を `Dog` と `Cat` が継承しているときに、自動的にそれに対応する `std::variant` を生成できるのか?
488
+
489
+ 3. この実装では長ったらしい表現(`std::variant` や `std::visit`)を書かなければいけないが、避けることはできないのか?
490
+
491
+ 4. この実装のポリモルフィズムは実践的に問題となる点(パフォーマンスやバグ、表現力が不十分であるなど)を抱えているのか?
492
+
493
+ 5. 上記の点が全てクリアされているならば、Julia と同じぐらいの表現力で多重ディスパッチ可能であると言えるのではないか?
494
+
495
+ 6. そうであるならばもとの Julia の文章はこの方式によるポリモルフィズムを想定していない or 不適切であるということになるのではないか?
496
+
497
+
498
+
499
+ ということです。