質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

707閲覧

ポリシーに基づいた設計について

asobinin

総合スコア69

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/23 08:47

現在ポリシーについて勉強しているのですが、正直分からないことだらけです。
そこで、以下の2つの質問についてお教えください。
まず一つ目に、実装には複数の方法が存在するようですが、以下に掲示する3つの方法の中ではどれが一番良いとされているのでしょうか。
二つ目に、ポリシーの説明として

システム要件や要求に応じて、実装にオプションが考えられるとき、ポリシーに基づいたクラス設計をとることで、核となる実装に修正を加えることなく、クラスに柔軟性を持たせられます。 『C++テンプレートテクニック第2弾』(高橋昌, 2014年)

という一文があるのですが、具体的に通常のクラスに比べてどのような柔軟性が持たせられるのでしょうか。

CPP

1// 実装パターン 2// staticメンバ関数を持つポリシークラス 3struct policy { 4 static void draw() 5 { 6 std::cout << "draw" << std::endl; 7 } 8}; 9template <class Policy> 10struct widget { 11 void do_something() 12 { 13 Policy::draw(); 14 } 15};

CPP

1// 非静的メンバ関数を持つポリシークラス 2struct policy { 3 void draw() 4 { 5 std::cout << "draw" << std::endl; 6 } 7}; 8template <class Policy> 9class widget { 10 Policy policy_; 11public: 12 void do_something() 13 { 14 policy_.draw(); 15 } 16};

CPP

1// 継承によるポリシー 2class policy { 3protected: 4 void draw() 5 { 6 std::cout << "draw" << std::endl; 7 } 8}; 9template <class Policy> 10class widget : public Policy { 11public: 12 void do_something() 13 { 14 draw(); 15 } 16};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

実装には複数の方法が存在するようですが、以下に掲示する3つの方法の中ではどれが一番良いとされているのでしょうか。

何をもって「良い」と見なすかという評価基準の設定次第かと思います。別の言い方では、質問中にある情報からでは良し悪しについて何も言えません。


具体的に通常のクラスに比べてどのような柔軟性が持たせられるのでしょうか

ポリシーベースのクラス設計では「ポリシーをテンプレートパラメータに取るクラス」の振る舞いを、そのクラスの外部から コンパイル時に 注入・変更・調整できます。

質問文中の "通常のクラス" が何を指すか不明瞭ですが、仮想関数を用いた継承ベースのクラス設計に比べると、ポリシーベースでは コンパイル時 に、継承ベースでは プログラム実行時 に振る舞いが選択される点が異なります。

投稿2019/06/25 08:55

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asobinin

2019/06/25 13:24

ポリシーベース=静的ポリモーフィズムのことだったんですね、ようやく頭の中で繋がりました。 通常のクラスというのは、おっしゃられたように仮想関数を用いたクラスのことです。 修正し忘れておりました・・・
asobinin

2019/06/26 14:55

自由度が高すぎて皆バラバラというのはC++の良いところでもあり悪いところでもありますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問