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

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

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

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

Q&A

解決済

3回答

9885閲覧

C++ の NULL ではなく null許容型等はあるのでしょうか

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2016/08/31 01:43

編集2016/08/31 01:57

C++ で C# でいうところの null 許容型はあるのでしょうか?
int型に、数値以外に nullを入れたい(NULLではないです)

C++

1int x = 0; 2x = NULL; // NULL はマクロ定義で処理系によって違うが、大体は「0」定義? 3 4// NULL ← この NULLじゃない 5// null ← こっちのイメージです(伝わるかどうか分からないですが・・・) 6 7// C# 的な下記のような定義はそもそも C++にあるのでしょうか? null許容型? 8// int? y = null;

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

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

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

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

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

guest

回答3

0

ベストアンサー

残念ながら言語機能や標準ライブラリには存在しません。Boostライブラリにて boost::optional<T> が提供されますから、こちらをお勧めします。

なお、次世代のC++標準ライブラリでは std::optional<T> として追加される予定です。(2017年以降~)

投稿2016/08/31 01:53

編集2016/08/31 01:54
yohhoy

総合スコア6191

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

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

退会済みユーザー

退会済みユーザー

2016/08/31 02:02

ご回答ありがとうございます。 標準ライブラリには存在しないのですね・・・。 次世代に追加される予定ということは、需要はそこそこという感じでしょうか! Boostライブラリ提供されている boost::optional<T> について調べてみたいと思います。
guest

0

既にBoost::optional<T>が提案されて解決済みとなっていますが、別の参考情報も。

c#のNullable<T>の実装 を見ればわかりますが、null許容型は少し頑張れば自前でも実装可能そうなレベルのクラス(構造体)+ Null許容型を簡単に扱うためのコンパイラのサポート(?? 演算子 や ?.演算子 など)になっています。

なのでコンパイラのサポートの部分は無理ですが、本体のNullable<T>の部分だけであれば、ググれば世の中にサンプルコードが色々見つけられると思います。

ただし、このページ(Nullable values in C++)のコメントに

There are lot of Nullable type implementation for C++ and most are incomplete. In C++ world, nullable types are called optional types. This was proposed for C++14 but got postponed. However the code to implement it compiles and works on most C++11 compilers. You can just drop in the single header file implementing optional type and start using it:

とあるように、その中のC++版の実装の多くは、どんな状況においても完璧に問題なく使える代物ではないようです。(限定された状況で問題ない範囲で使用している分にはいいのでしょうが)

という事で、Boost::optional<T>で問題ないなら、Boost::optional<T>を使った方がよいのでしょうね。

ちなみに、Microsoftが実装したコードもgithub内で見つけました。
odatacpp-server/include/odata/common/nullable.h

ご参考までに。

投稿2016/08/31 02:51

KenjiToriumi

総合スコア344

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

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

0

ありませんです。boost.optional とか、いかがでしょう。

こんなカンジで使います:

C++

1boost::optional<int> oi = convert(text); // nullかもしれないint値をもらい、 2if (oi) // それがnullじゃなかったら 3 int i = *oi; // operator* で値を取りだす

投稿2016/08/31 01:56

episteme

総合スコア16614

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

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

episteme

2016/08/31 01:56

っく、カブった orz
yohhoy

2016/08/31 01:57

゚Д゚)b
退会済みユーザー

退会済みユーザー

2016/08/31 02:11

ご回答ありがとうございます。 記載頂いた使い方のサンプルを参考に試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問