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

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

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

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

Q&A

解決済

3回答

1894閲覧

C++にてヘッダファイルオンリーで型安全な定数を定義したい

wqwqw

総合スコア17

C++

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

1グッド

2クリップ

投稿2016/07/12 04:07

編集2016/07/12 04:13

C++にてヘッダファイルMyLib.hをincludeするだけで使用できることを前提としたライブラリを制作しています.
とある定数MyConstantを提供したいのですが,次の制約があるため#defineを用いることができません.

  • MyConstantMyType型である.
  • MyConstantはリテラル型の値で初期化される.
  • 型安全を保障したい.
  • 異なる翻訳単位間で&MyConstantの同一性を保証したい.

参考にするためにVisual C++ 2015にてstd::coutなどがどう実装されているかヘッダファイルを遡って検索してみましたが,以下のようにextern宣言されていました.

cpp

1//... 2__PURE_APPDOMAIN_GLOBAL extern istream cin, *_Ptr_cin; 3__PURE_APPDOMAIN_GLOBAL extern ostream cout, *_Ptr_cout; 4__PURE_APPDOMAIN_GLOBAL extern ostream cerr, *_Ptr_cerr; 5__PURE_APPDOMAIN_GLOBAL extern ostream clog, *_Ptr_clog; 6//...

MyLib.hextern MyType MyConstant;と宣言してもどこかの翻訳単位で明確に定義する必要が出てきてしまいます.
どのように実装すればよろしいでしょうか?

mondaminZ👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

こんにちは。

ちょっと大掛かりな感じになりますが、シングルトン・パターンを使えばできると思います。
マクロを使って定義部のコード量を減らせば可読性はどうにか維持できると思います。

他に、VC++限定でよければ、selectanyで定義することも考えられます。

投稿2016/07/12 04:41

編集2016/07/12 04:41
Chironian

総合スコア23272

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

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

wqwqw

2016/07/12 05:17

できればシングルトンによってではなく飽くまで`MyType`型で実現したかったのと,処理系依存の方法は使いたくなかったのですが,VC++でselectanyが存在するということは一般的には解決方法がないという結論に達しました. シングルトンパターンを利用することにします.ありがとうございました.
Chironian

2016/07/12 05:38

MyType const& MyConstant::get();で取り出せるようにしておけば、出てくるものはMyTypeにできますよ。 下記のようなイメージになると思います。 class MyConstant {   MyType const Constant;   MyType() : Constant(リテラル値) { }   コピー/ムーブ禁止コード; public:   MyType const& get() const   {     static MyConstant instant;     return instant.Constant;   } }; マクロ等で短縮しないと、定義が見にくいですね。 リテラル値が非型パラメータに指定できないような型の場合、クラス・テンプレートで短縮するのは苦労しそうです。(バッと考える限りではできないかも?)
guest

0

C++であればMyLib.hconst MyType MyConstant;const付きで宣言してもダメですか?

投稿2016/07/12 04:54

kopio

総合スコア487

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

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

wqwqw

2016/07/12 05:18

その方法であれば`MyLib.h`をincludeした別々の処理系で`MyConstant`の同一性が保証されません.
kopio

2016/07/12 05:23

あ、失礼。 &MyConstantの同一性という条件を見落としてました。
guest

0

このブログに書かれている内容あたりでしょうか。

投稿2016/07/12 04:33

MasafumiOkamoto

総合スコア254

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

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

wqwqw

2016/07/12 05:13

リンク先のブログの内容にて`MyConstant`が外部リンケージの必要があることが分かりました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問