C++相談室 part142
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
C++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/
C++相談室 part141
https://mevius.5ch.net/test/read.cgi/tech/1550772463/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured C++ coding standards が、入門書と effective C++の間という感じで良かったのですが、今新品で買いやすい和書の中で同じくらい良い本ありますか >>173
それでコードを書けるようになるとは全く思わん。 コード書くために勉強したことが無い人間とコード書くために勉強した人間に分かれるな RPGのバトルシステムがいつまでたっても出来ない
どうなってんだコレ そこでレポート プログラム ジェネレータを思い出さないと
文句はユニシスに言っとくれ RPGなつかしいなw
知人でそれの専門で仕事やってるやついたが
今ごろどうしているだろうか・・ >>180
自分が具体的に何を作るのか見えていないとか、自分が何が分からないかがわかっていないとか。 これもSFINAE???
int plus(int a,int b){return a + b;}
double plus(double a,double b){return a + b;}
int main( int argc, char *argv[] )
{
double c = plus(1.0,2.0);
return 0;
} SFINAEを理解してないな?
templateでわざと失敗させるんだぞ それは関数のオーバーロード(オーバーロード関数)
SFINAEはテンプレートに関わる話 SFINAE ていう単語みるたびになぜか
ソフバンの白犬が低い声で「スフィ姉ーーー」て言ってる映像が頭にうかぶ >>188
最初のplusで失敗して、次のオーバーロードを探しに行ってんじゃん。
もし最初でコンパイルエラーなら、このプログラムはコンパイルされないが、SFINAEのおかげでコンパイルエラーが出ない >>186
自分の興味のあることをやっていたら気づいたらコードが書けるようになっていた人と
コードを書けるようになることを目標に勉強をした人
前者は入門の仕方を聞かれると上手く答えられない傾向にある
とりあえず好きなもの作ってみて困ったらリファレンスとかみれば良いんじゃないの?とかは割とガチで言ってる せやな
なぜそこでロベール!?とか思ったけど、なんか納得した rvalue・lvalueの見分け方について、=の左に書けないならrvalueって考えで良いですかね? >>194 確かダメじゃないかな。
C の例でアレだけど、配列名 int a[5]; の a は
左辺値だけど代入の左辺に置けない、
「代入不可能な左辺値」というカテゴリになる。
『プログラミング言語C++』第4版 §6.4.1 (p. 175)の図によると
左辺値 lvalue は「アイデンティティを持ち、ムーブ不可能」
右辺値 rvalue は「(アイデンティティの有無によらず)ムーブ可能」
…ムーブできるか出来ないかの判断を、左辺値か右辺値か見分けることで
やろうとしてるなら、この説明は循環論法でしかないけどね。 その場で(1つの文の中で)ムーブされ得るやつが右辺値、ぐらいで良いのでは、
と言いたいところだが
SomeType a = b = 1;
でbあ右辺値なのかと言われるとうーん…
実際bがその場で所有権を失うこともできる(SomeTypeにムーブコンストラが定義されていた場合
のだから当たらずしも遠からずだとは思うが知らん てかリファレンスだけ必要な奴はここにそういうことを聞きには来ないだろ。
なんかその辺の感覚がすでにずれてるように思うが。 >>195
「代入できない」って視点で言えば194で合ってるんでは?
確かに a[0] =5 なんかはできるけど、 a = b みたいにポインタそのものは代入できないわけだし。 >>196
右結合なんだから b は左辺値、 b = 1 が右辺値でいいんでは? 全く関係ない話になるけど、JNI = Java Native Interface(?) なるものを使えば、
C++で OS 非依存のアプリが作れるんだね。多分。
C++からJavaの任意のメソッドを呼び出せるし、逆も可能なので、
グラフィックをJavaに描かせて、キーやマウスのイベントをJavaからC++に
伝達すればよさそう。すると、LinuxやAndroidで共通に動くC++アプリ(?)
が出来てしまう。wasmも必要ない。 >>200
C++の部分はネイティブなのでOSに依存する スマン。CPU毎にバイナリは必要で、
clangに -macrh=xxx-xxx-xxx オプションを指定して CPUやOSを
指定してコンパイルしておくことを想定していた。
ただし、複数のCPU/OS向けのバイナリを1つのAPKにパッケージして、
使用時に自動選択する事が出来るらしい。 わざわざjavaを使わなきゃいけないのが気にくわない
その場合、javaだけで書くこと以上のメリットある? Androidアプリは、Javaで書くのが基本とされてるけど、
Chromeブラウザなんかはきっと、C++で書いたものを ARMなどの
CPU向けのnative binaryに直し、それをAPKにパッケージ化して
配布してるのではなかろうか? AmazonのFire7 や Fire HD 8 などの
タブレットのCPUはどちらもARMらしい。スマホもARMが多いのかな。 >>205
基本的な描画系と入力系をライブラリ化しておけば、メインロジック部分は
C++で書けると思うよ。 さっき、AdoptOpenJDK なるものをインストールしてみたら、
java と javac コマンドが起動することを確認した。
多分このJDKは、Oracle フリーで無料でクローズド商用利用できると思う。 jniはjavaのプラットフォームにc++での開発成果物を持ち込むためのもので、そうでないならわざわざそんなもの使う意味は薄い
マルチプラットフォームなアプリを作りたいならQtなりwxなりを使った方が速いし楽 >>208
でもいつ訴えられるかわからないから怖いですう。 そもそも、Androidアプリにとってのシステムコール(API)とは、Javaの関数だと
思うので、この構造自体は Android における「最も高速なアプリ」になっている
と思う。 >>210
一般アプリ作者は大丈夫だと思うな。一番危ないのは、オイラみたいに、
ToolKit作って儲けようなんて思ってる人なのさ。(^_^;) 糞デカイ上に更新面倒なjavaのruntime入れさせるほうが害悪だろ
flashより糞度が高い AndroidはJREはプリインストール済みなんじゃないの?
オイラは実機持ってないので全く分からないんだな。 androidで実質c++でのアプリ開発する仕組みなら既にある
jniそのまま使うよりは大分マシ 何でグラフィックをわざわざJavaに?
>>217
QtならほぼC++で書ける Qt は、内部的に Backend で Java を使ってるのかな。 vector に格納されてる値から添え字の番号を取得するための最も手軽な方法はなんでしょうか
イテレータから添え字番号を取得することはできますが、あくまで値からやりたいです 格納してる値にインデックスの手がかりがないんだったら
findで探して結果のイテレータから取得するしかないな >>223-224
ありがとうございます
格納する値の範囲もサイズも小さいvectorなので、今回は辞書を作って対応しようと思います >>225
そんな単純な検索なら3行くらいなんだから作ればいいのに >>200
とても興味を覚えました
私は、そろそろ言語間でライブラリも共用されるべきだと考えています
一つの記述体で各言語共通というのはさすがに難しいにせよ、
Java のライブラリと同等なもの(名前と機能が共通のもの)が C++ にもあってもいいんじゃないか?と数年前から妄想しています… JavaとC++に共通インターフェースを作るのは反対。
車輪の再発明にしかならない。自由を奪うだけの愚策。 >>231
強要するのではなく、オプション(選択肢)として提供するのはどうでしょうか? >>232
共通ライブラリを使う側にとってはオプションであることは当然。
共通ライブラリを作る側の話をすべき。共通ライブラリの規格決定権者が増えすぎること自体が好ましくない。
これはEU諸国がトルコがEU参加することを拒否する感覚に近い。 >>233
私は EU には否定的(グローバリストの巣窟であり、普通選挙/自由選挙による合意形成をスキップするポジションを作って人を操作するからくり、トルコもたぶん目が覚めているのでは?)ですが、それはさておき、
すでにある java/classpath スケルトンを真似してしまおう、という低姿勢・低いプライドを貫くのであれば、規格策定者は基本要らなくなりませんか?だって真似するだけだし… まずは、Javaと瓜二つな C#、.NET、C++/CLIが今どうなっているか考えてみては。 >>229
ちょっと話しはズレるけど、あなたの賛同で嬉しくなったので、入手した耳寄りな
情報を書いておこうと思う。既に知ってる人も当然いると思うけど、
WebAssemblyで作ったようなWebAppliは、ブラウザのURL欄やタイトルバーなどが
表示されてしまうのが難点として残っていた。ところがなぜかElectronでは消せて
いたのでChromeではなくChromiumを使っているからかと思っていた。
ところが、manifest.json なるものを書いて、HTMLにそのファイルを使うように
書いておいて、display プロパティーを standalone やfullscreen にすると、
URL欄が消せるらしい。 >>237
もう時代はすっかり html/css/js ですね…
VSCode も Electron ですし… 質問を変えてみよう。
C++11やC++14のコードは、職場で取り入れられてますか。 >>239
ガンガン取りいれてるよ。
なにげにでかいのが日本語識別子の保証。適切に使うと可読性が笑っちゃうくらい上がるw
ヘッダーのプロトタイプ宣言とかが特におすすめかな。
あとchar16_t/char32_tも結構ありがたい。WindowsとUNIX系のOS間で同じ文字コードとして共通で使える型が以前はなかったからね。
20でようやく入るみたいだが、なぜchar8_tを入れかったのか(´・ω・`)
std::initializer_listもかなり便利。型安全で個数も分かる上に、引数の一番後ろじゃなくてもいいので、cの...と違って気軽に使える。
あとよく使うのは範囲for文と、イテレータの簡略化かな。いくつかの演算子をオーバーロードすれば良いだけだから、
結構気軽に範囲for文対応のイテレータを書ける。
ラムダ式も関数の引数に直接関数を埋め込んだりできて便利。 >>240
>char16_t/char32_tも結構ありがたい
確かに
char16_t と u"" がなければ win32api W 系とか途方に暮れていたとおもいます… https://mevius.5ch.net/test/read.cgi/tech/1434079972/53 ガンガン最新を追うべきとまでは思わないけど、
C++11 は最低限度じゃないかなぁ。 17便利すぎ
variant,visit,lambda,if constexpr
のコンボで捗る つーか今はもうC++11の機能は使わずにC++で書け!といわれても
やりきる自信がなくなった・・ c++11とか名乗るから誤解されるんだよ。
c++++とかのがイメージ的に正しい。 >>249
repeat(int i; n) で for(int i; i<n; i++) と同じ意味な機能 >>250
そんなどうでも良いもののために予約語追加する意味って
その文法じゃ初期値すら変えられない 初期値はi=0とかすればいいのか
でもそうなるとi=1にした場合何回ループするのか混乱しそう >>229
QtとかGtk、wxとか色々有るじゃん。。。
入れるの面倒くさいなら、Power Builder(だっけ?)とかの有料開発環境はVSを除いてマルチプラットフォームなライブラリが売りだぞ。 >>253
Java の人も C# の人も c++ の人も python も ruby も一緒の名前で一緒の機能が使えたら,コストの中でも一番高くつく勉強コストを減らせるのではないでしょうか >>251
Linuxのカーネルにrepeatマクロ大量にあるもん >>254
wxでもQtでもメジャー言語のbinding位あるだろ >>254
うん。
それはまさにそうで、だからQt,Gtk,wxあたりのメジャー所は色んな言語にラッパーがある。 webプログラマーなんですが、右辺値、fowardっていつ使うのか気になります
というかなんでそこまで、厳密に分ける必要があるのか
業務で使ってる方、使用例を教えてください 右辺値というかムーブ関数の定義といらなくなるオブジェクトにstd::move付けとくのは絶対損にはならないからとりあえずやっとく
forwardはテンプレートライブラリ作るなら必須だけど自分では使ったことないなあ コピーにコストがかかる場合は、std::swapやstd::moveのが早い場合があるからね。ムーヴはコピーじゃなくて引っ越しだから。 まあ理論上はね。。そういう実装になってるかどうかはコード見ないとわからんけどね。 基本的には高速化が目的でmove使わなくてもなんとかなるが、
所有権絡むとmoveは必須になる
forwardはtemplateで引数渡すときにmoveやら参照やらの完全転送する場合必須 ちょっと実際にやってみようか。コピーコンストラクタで十秒待つコードを書く。ムーヴコンストラクタとムーヴ代入でなにもしない。
この状態でstd::moveを使わないで代入すると十秒かかる。 >>264
>所有権絡むとmoveは必須
必須とまでは言えない
T::T(const T& obj)
という通常のコピコンを定義して、コピコンの中でconst剥がししたら
とりあえず所有権の移動もmove無しで逝ける >>260
高速化のために出来るのは、アルゴリズムのレベルでの工夫を別にすれば、出来ることはショートカットだ。
高速化とは近道なんだよ。
場合分けが出来るなら、どうしてもやらなければならないこと、やらなくてもいいことを「区別」できる。
区別できるなら、やらなくてもいいことは省略できる。
言語での区別が無くても、たとえば C でも区別を陽に書けばムーブみたいなことだって、そりゃあ出来るけども、
そんなクソ面倒くさいことはしたくないので言語でのサポートがあるとありがたい。
まあ速度的にそこまで必要ないってのなら、区別を積極的に利用しなくてもかまわないよ。
でも、必要なときに出来る方法が用意されているとうれしいし、
C++ を使うときというのはそれなりに実行速度が必要なときだろうし。 とわいえmoveコンストラクタの方が意図が明確なコードが書けるから良い。
moveコンストラクタがふさわしい例っていやーつぎごケース。
class BarWithBigData {
Foo* m_pBigData;
BarWithBigData() : m_pBigData(new Foo[1000000000000] { }
~BarWithBigData() { delete[] m_pBigData; }
BarWithBigData(BarWithBigData&& rhs) { m_pBigData = rhs.m_pBigData; rhs.m_pBigData = NULL; }
Foo* refBigData() { return m_pBigData; }
};
ちなstd::arrayは使った無いから知らん 訂正orz、
誤:
Foo* m_pBigData;
BarWithBigData() : m_pBigData(new Foo[1000000000000] { }
正:
Foo* m_pBigData;
public:
BarWithBigData() : m_pBigData(new Foo[1000000000000]) { } コピコンの中でconst剥がしってちょっと何言ってるか分からない 十秒待つ待つコードはWindowsなら#include <windows.h>してSleep(10*1000);であり、
Linuxなら#include <unistd.h>してsleep(10);だ。
C++11ならstd::chronoに待つ関数があったはず。 >>271 「move無しで(未定義動作に)逝ける」ってことでしょ。 >>271
こうじゃわ;
BarWithBigData::BarWithBigData(const BarWithBigData& rhs) { m_pBigData = rhs.m_pBigData; const_cast<BarWithBigData&>(rhs).m_pBigData = NULL; }
>>269もmoveコンストラの変わりに↑のように書いても逝ける ■ このスレッドは過去ログ倉庫に格納されています