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

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

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

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

Q&A

解決済

2回答

1050閲覧

typedefで意味のない定義について

do31

総合スコア45

C++

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

0グッド

0クリップ

投稿2020/05/07 13:13

C++の勉強をしています。
本の内容の一部ですが

get関数は以下のように定義されており
int_type get();
int_typeは以下のように宣言されています。
typedef int int_type;

ここで疑問なのですがどうして「int get();」とせず
「int_type get();」とするのでしょうか。
私としては覚える事が1つ増えるだけでメリットがないように思えるのですが・・・

将来「typedef long int_type;」のように書き換える可能性があるからこのような定義にしているのでしょうか。
それとも処理系によってint宣言を変更したい場合があるのでtypedefで定義しているのでしょうか。

よろしくお願いします。

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

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

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

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

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

maisumakun

2020/05/07 13:14

単なるtypedefのサンプル、ということはないですか?
退会済みユーザー

退会済みユーザー

2020/05/07 13:21 編集

> それとも処理系によってint宣言を変更したい場合があるのでtypedefで定義しているのでしょうか。 そういうケースはありますが、それに対する説明や前置きなど無しに入門書でやるのはあまり適切では無い気はします どこの本でしょうか
do31

2020/05/07 13:19

cin.get();という関数です。
guest

回答2

0

こんにちは。

将来「typedef long int_type;」のように書き換える可能性があるからこのような定義にしているのでしょうか。

それとも処理系によってint宣言を変更したい場合があるのでtypedefで定義しているのでしょうか。

これらのどちらもあり得ると思います。
ただ、その場合は、名前の付け方があまり良くないですね。例えば、「typedef int int32_t;のように32bit整数型になるように処理系毎に定義する」、「typedef int counter_type;として当該アプリのカウンターの型を定義する」のように、その型の主旨が分かるような命名が好ましいと思います。

投稿2020/05/07 13:24

Chironian

総合スコア23272

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

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

0

ベストアンサー

テンプレートが絡んでいるのであれば、
int_typeは、コンパイル時の"型の変数"と捉えると良いかと思います。
以下は、テンプレートの実引数Tに応じて型が変化する例です。

C++

1template< typename T > 2struct Traits { typedef T int_type; }; 3 4template<> struct Traits< char > { typedef int int_type; }; 5 6template< typename T > 7struct User { 8 typedef typename Traits< T >::int_type int_type; 9 int_type get() { return int_type{}; } 10}; 11 12int main() { 13 User< char > u_c; 14 auto c = u_c.get(); //cはint 15 User< int > u_i; 16 auto i = u_i.get(); //iはint 17 User< long long > u_ll; 18 auto ll = u_ll.get(); //llはlong long 19}

この場合、Tがcharであればint_type = int、それ以外ならint_type = Tと解釈できます。

テンプレートが関係ない場合は見当違いの回答になりますので、スルーしてください。

投稿2020/05/07 20:23

編集2020/05/07 20:40
ameagari_hare

総合スコア39

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

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

yohhoy

2020/05/08 04:17 編集

質問者コメント「cin.get();という関数です」とあるので、直接的にはこちらの回答のほうが実態に近いと思います。 https://cpprefjp.github.io/reference/istream/basic_istream/get.html 対象の cin は basic_istream<char> 型ですから、char_taits<char>を経由して int_type = int となりますね。 仮にワイド文字列用ストリーム wcin.get() に変えると int_type = wint_t という(intとは別の)型になります。 https://cpprefjp.github.io/reference/string/char_traits.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問