C++にこんな機能があったらいいのに…と思ったことはありませんか?

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by MoNoQLoREATOR » 13年前

C++にこんな機能があったらいいのに…と思ったことはありませんか?
私はあります。

○ローカル関数
どうして定義できないのでしょうね。あったら何かと便利なんですけどね。私はこれを使いたい時、構造体と operator() を利用して擬似ローカル関数を作ってそれを使っています。

○後置参照
後置参照と言うのかどうかわかりませんが、多くの言語の場合、どんな順番で定義を書いても大丈夫ですよね。C++では常に順番に気を付けないといけないので、面倒でしかたがありません。これができればインクルード関係もすっきりすると思うんですよ。

○↓これが可能

CODE:

{
   if(~) break;
}
無性にこの機能がほしい時があります。ありませんか?ありますよね?ですよね?(←w
他の書き方をすれば同じ結果を得ることはできますが、すっきりしないんですよ。見た目が。
こんなことでいちいち関数化するなんて耐えられませんし。
現在は下のように書く事で擬似的に実現させています。
int damy = 0;
switch(damy){
case 0:
   if(~) break;
}

○ポインタ、参照、コネクション?
ポインタと参照を融合させたものとして、「コネクション」というものを考えました。とは言っても、Javaで言うところの普通の参照です^^;
コネクションを宣言する際は、型名の後に $ をつけます。($にした理由は特にありません。適当です)
ポインタの場合は * を、参照の場合は & を型名の後につけますよね。あれと同じです。
初期化の際に型が同じ変数を指定すると、それがコネクト先として設定されます。
あとは、普通の変数のように使用するだけです。
コネクションへの変更はコネクト先に反映されます。
つまり、コネクションを、コネクト先の変数そのものとして考えることができます。
ここまではC++で言うところの普通の参照と同じですね。
コネクションの特性は、途中でコネクト先をかえることができるところにあります。
コネクト先を変えたい場合は $= 演算子を使用します。
以下サンプルコードです。

CODE:

int itirou = 0;
int $ con1;
con1 $= itirou; //コネクト先をitirouに設定

int jirou = 1;
int $ con2 = jirou; //宣言と同時にコネクト先をjirouに設定 

int $ con3 = con1; //宣言と同時にコネクト先をitirou(con1のコネクト先)に設定

con1 = con2; //itirouにjirouを代入
//itirou==1, jirou==1

con2 $= con3; //con2のコネクト先をitirou(con3のコネクト先)に変更
con2 = 0;
//itirou==0, jirou==1
/*
●コネクト先●
con1 → itirou
con2 → itirou
con3 → itirou
*/
まあ、「参照先を途中で変えられる参照」と考えればわかりやすいでしょう。
ポインタを使うといちいち *変数名 と書かないといけないので面倒なんですよ。

○関数の戻り値操作
関数を作るとき、「値を返すと膨大なコピーが発生するから、参照引数で受け取ってそれを直接操作するようにしよう。あ~でも結果を返すっていうイメージを壊したくないんだよな~」って思ったことはありませんか?
私はあります。しょっちゅうあります。
そこで考えました。

CODE:

//~関数定義方法~(例)
std::vector target Function(){
   for(int i=0;i<100;++i) target.push_back("\(^o^)/");
   return; //戻値は省略可能
}
|戻値型| |戻値受取変数名| |関数名|(|引数|){|関数定義|}
という構文です。
特にこの機能を使う必要がない場合は戻値受取変数名を省略できます。
関数の中で戻値を操作できる所がポイントです。
ついでに戻値を書くのを省略できても便利だなと思いました。
なお戻値が初期化されていなかった場合は先にデフォルトコンストラクタで初期化します。
const int satou = Function();
//satouが初期化されてから関数が実行される。constがついていたら一時的にconstが外される


以上です。
ここまで読んでくださってありがとうございました。
最後に編集したユーザー MoNoQLoREATOR on 2012年6月23日(土) 18:36 [ 編集 1 回目 ]

naohiro19
記事: 256
登録日時: 14年前

Re: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by naohiro19 » 13年前

C++11では関数の中に関数を定義することが可能です。

CODE:

auto Add = [](int x, int y) ->int { return x+y; };
これをラムダ関数と呼びます。この機能はVIsual Studio 2010, 2012 RCでしか使えない機能です。
最後に編集したユーザー naohiro19 on 2012年6月23日(土) 18:55 [ 編集 1 回目 ]

nil
記事: 428
登録日時: 13年前

Re: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by nil » 13年前

そうですね……僕がこのごろ欲しいと考えるのは、
ポインタを扱わなくて済む可変長配列ですね。D言語的な何かは欲しいです。

あとは列挙体のメンバ数(?)を求められるような仕組みですかね。
普段は末尾に 型_NUM,や型_MAX みたいなのをつけていたりするんですが、変数にもしもそれが代入されてしまっていれば、クラッシュしてしまうので……
(わかりやすい説明ができない)

宣言された変数には勝手に初期値を代入してくれれば……とは思います

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前

Re: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by Dixq (管理人) » 13年前

> ○↓これが可能

例外処理をすれば似たようなことができると思うのですが期待する動作ではないですか?

CODE:

try {
	if(~) throw XXXX;
}catch (****) {}
> C++にこんな機能があったらいいのに…と思ったことはありませんか?

なんかありすぎて困ります。。。
最近「C++」「JAVA」「C#」が常に全部同じ仕様ならいいのに(←無茶)
と思います・・・。
C++はヘッダを書かないといけないのがまずありえない怠いし、
C#のプロパティが欲しい、インターフェイスを継承じゃなくimplementsできて欲しい、Delegatorを書くのが面倒、
IDEで言えばインテリセンスを賢くして欲しい、リアルタイムにエラーを表示して欲しい、ボタン一つで足りないinclude文を追加してほしい・・・。
などなど上げ始めるとキリが無いです。。。

前述の3言語が同じ仕様になるというのは無茶な話ですが、せめてJAVAとC#が同じならいいのにと常々思います。
最後に編集したユーザー Dixq (管理人) on 2012年6月23日(土) 23:29 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by ISLe » 13年前

MoNoQLoREATOR さんが書きました:現在は下のように書く事で擬似的に実現させています。
int damy = 0;
switch(damy){
case 0:
   if(~) break;
}
マクロネタで有名ですが、do {} while (0)が使えるのでは?
do ~ whileでひとつの文なので他より使いやすいと思います。
#C言語でも通用します。

C/C++はいつまでも余計な世話をしない言語であって欲しいですね。
楽したいひとは他の言語に移ったら良いと思います。

アバター
nullptr
記事: 239
登録日時: 13年前

Re: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by nullptr » 13年前

うーん、上げている例では「確かに!」って感じたものはないですねえ
全部「楽したい」っていう目的しか感じません

> C++にこんな機能があったらいいのに…と思ったことはありませんか?
私が思ったのだとD言語のscope(exit)とかですかね~
一応boostに同じ物がありますが標準でポイと使えたらいいのにとかオモッタコトハアリマス

無名関数もそうですがC++11で結構いろいろ改善されてきてますから今は特に無い気がしますねー_(:3」 ∠)_

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

RE: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by MoNoQLoREATOR » 13年前

>>naohiro19さん
返信ありがとうございます。
しかし、ラムダ関数では無名関数を定義することしかできないのではありませんか?
私が定義したいのはローカル関数です。
宣言したスコープ内でのみ有効な関数が欲しいのです。

>>涼雅さん
std::vector「俺の存在って…」
たしかに変数は宣言時に初期化してくれてもいいんじゃないかと思いますね。
あれ?でも int hensuu(); って括弧をかけば初期化されませんでしたっけ?

>>キューさん
それはC++に対してというよりもエディタに対して求めている機能ですねw
そういえばActionScriptではヘッダを書いた記憶がないですね。
クラス名を書けばかってにインポートしてくれますし。
C++もそうすればいいのにと思います。

>>ISLeさん
すばらしい。光の速さで脳みそにインプットしました。
たしかに、最近は他の言語の良さに気づいて浮気ぎみです。
Javaが良い言語のように思えるので、今度本格的に勉強したいと考えているほどです。
きっとActionScriptの嫌いなところ(私が嫌いなところ)がC++寄りになっていて(断片的な情報から推測)私好みの言語仕樣なのだろう と かってに期待しています。
でも、C/C++は非常に慣れ親しんだ言語なので、ずっと付き合っていきたいとも思うんですよね。
気に入らないからと言って突き放すのではなくて、なんとかして自分好みのものに変えていきたいという願望を持つことは自然なことだと思うのです。

>>獅子さん
「楽をしたい」という感情は、非常に重要なものだと思います。
人間は楽をするために進化を遂げるのです。
楽をするために、苦労をして世界を変えていき、文明を築いてきたのが人間なのです。
この感情がなければ、新たな発展は望めません。
・・・私は誰なんだ?
こほん。まあとにかく、楽は罪ではありません。
苦労しないとプログラムが書けない言語よりも、楽にプログラムが書ける言語の方が優れていると私は思います。

ここまで書いておいてなんですが、楽をする目的で挙げた機能なんてほとんどありませんよ?
ローカル関数は、より秘密主義なプログラムの作成を可能にするためですし、break文の件はソースコードを見やすくするためです。
そして関数の戻値操作は、「値を返す」という概念を守りながらデータコピー量を最小限に抑えるための機能です。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前

RE: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by h2so5 » 13年前

MoNoQLoREATOR さんが書きました:>>naohiro19さん
返信ありがとうございます。
しかし、ラムダ関数では無名関数を定義することしかできないのではありませんか?
私が定義したいのはローカル関数です。
宣言したスコープ内でのみ有効な関数が欲しいのです。
名前を付けることもできますよ。
最後に編集したユーザー h2so5 on 2012年6月25日(月) 07:04 [ 編集 1 回目 ]

アバター
nullptr
記事: 239
登録日時: 13年前

RE: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by nullptr » 13年前

MoNoQLoREATOR さんが書きました: ここまで書いておいてなんですが、楽をする目的で挙げた機能なんてほとんどありませんよ?
ローカル関数は、より秘密主義なプログラムの作成を可能にするためですし、break文の件はソースコードを見やすくするためです。
そして関数の戻値操作は、「値を返す」という概念を守りながらデータコピー量を最小限に抑えるための機能です。
ですから、すでにある機能で実現が可能ですよね?それをなぜ言語に求めるのか?それを楽したいと言うんでしょう?

例えばbreakの件

CODE:

{
    if( ~ ) break;
}
というのはbreakから}までの処理をやめたいということですよね?
なら

CODE:

{
    if( ! ~ ){
    }
}
でいいと思いますが?gotoでもできるでしょう。
キューさんの言う例外の利用、ISLeさんのいうdo~while、いくらでもやりようがあるでしょう。
すこし考えて試行錯誤すればだれだって思いつくことです。見た目が悪い、そうですか?
普通にif(!)やgotoや例外やdo~whileは十分見やすいと思いますが?
マクロ使って構文を作ったりもできますよね?
私には楽したいだけにしか見えません。だってすでに「今の機能でできないか」を考えること放棄してますよね。

「楽をしたい」という感情は、非常に重要なものだと思います。
人間は楽をするために進化を遂げるのです。
楽をするために、苦労をして世界を変えていき、文明を築いてきたのが人間なのです。
この感情がなければ、新たな発展は望めません。
本当に機能をホイホイ追加することが「進化」だと思ってるんですか?
楽するために進化してきたと断定してますが私は全くそう思いません。

なんで飛行機が生まれた?楽したいから?
なんで電話が生まれた?楽したいから?

「楽になる」はあくまでも結果でしか無いでしょう。

空を飛んでみたいと想ったから飛行機ができて普及したんじゃないですか?
遠くの大切な人と話しがしたいから電話ができて普及したんじゃないですか?

楽したいという感情が全く進化に関係してないとは言い切れません。
でも楽したいなんて甘い感情が「世界を変えていき、文明を築いてきた」なんていうのはおかしいと思います。

楽するための機能がいっぱいの物を作ろう!というのは二次創作と同じだと思います。
なんの目新しさも感じないです。もちろん、同人界と同じように多くの人が動いてお金も動くとは思いますがね。
創作界隈の質、アニメマンガゲームの質が落ちてるのはそういうことでしょう。

楽したいと同じように、新しいものを作るという考えの無さがむしろ「衰退」につながってるんです。

・・・長々と書きすぎたすみません。
とにかく楽したいなんてのは全くクリエイティブでないと思います。

アバター
GRAM
記事: 164
登録日時: 14年前

RE: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by GRAM » 13年前

楽をするということを議論するとき、むしろ考えるべきなのはそのリスクのほうでしょうね。
面倒だと感じて適当に書いた結果たまに痛い目を見るC++のADLとか・・・orz
書き方が増えれば、正しい書き方で書くのが難しくなるというのであれば、
だいたい同意しますわ。

ちなみに自分がほしいのはそうですね・・・
・C#をやってプロパティーがいいなと思いましたね。注意するべきことが増えるのは面倒な気もしなくはないですが。
・文字コードをもうちょっと何とかしてほしいですね。ロケールとか、wstringとstringとか考えるの面倒ですわ。
  いろいろと難しいのはわかりますけど、どうせ普通の処理能力をもつPCでしか動かせないような言語になってきてるんですし。
・おんなじ系統でそろそろintが何ビット長とかlongが何ビット長とか決まらないんですかね?
  まぁ決まらないでしょうね・・・
・むしろ書くべきじゃないコードを書けないように仕様変更されたりしないですかね?されないですね。
・コンセプトをさっさと入れてください。マジで・・・。

以下本題とそれるので。
► スポイラーを表示
最後に編集したユーザー GRAM on 2012年6月25日(月) 13:41 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: C++にこんな機能があったらいいのに…と思ったことはありませんか?

投稿記事 by ISLe » 13年前

MoNoQLoREATOR さんが書きました:>>naohiro19さん
返信ありがとうございます。
しかし、ラムダ関数では無名関数を定義することしかできないのではありませんか?
私が定義したいのはローカル関数です。
宣言したスコープ内でのみ有効な関数が欲しいのです。
naohiro19さんの書かれたラムダ式は、宣言したスコープ内でのみ有効なAdd関数として使えます。

↑みたいに既に希望通りのものが目の前にあるのに気付かないレベルの「楽をしたい」だというのが文章から伝わってくるのですよね。

コメント含めて挙がっている要望は他の言語ではとっくに実現されていることばかりですね。

優れたプログラマは楽をするための苦労を厭わないわけですが、それは、自分が苦労して、自分以外も楽ができる、という図式です。
対して非難される「楽をしたい」は、自分ひとりの望みを叶えるために他人が苦労してくれるのを期待してただ待っている、という図式です。

飛行機の話で言うなら、飛行機の汎用部品を設計・製作するのが前者、誰か簡単に組み立てできる部品作ってくれないかなと言ってるのが後者。
飛行機に乗って楽に遠くに行けると言うのは乗客の視点で技術者の視点ではないですから別の話ですね。

単に言葉尻だけをとらえて重箱の隅をつつくような行為こそクリエイティブからほど遠いと思います。

世の中PCでしか動かせないような言語ばかりになってそういうプログラムしか作れないプログラマばかりになったら、家電とかに入ってる組み込みマイコンもPCなみの性能が必要になるでしょうね。
いままでとやれることは大差ないけど、タッチパネルとスタイリッシュなデザインのUIで価格帯が5万円くらいアップするのでしょうかね。
テレビやエアコンのリモコンも高価になるでしょうけど、代わりに全部スマホが肩代わりすることになるかもしれないですね。
いまはテレビあたりだけですが、高くて売れない、安くて利益が出ない、という問題があらゆる家電に広がるでしょうね。

クリエィティブなことがしたいなら自らプログラムを書くことはやめるべきです。
最後に編集したユーザー ISLe on 2012年6月25日(月) 18:41 [ 編集 7 回目 ]