トップページ⇒tech
1001コメント298KB

C++相談室 part115 [転載禁止]©5ch.io

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2014/12/18(木) 13:46:24.42ID:Mboq20NA
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part114
http://peace.2ch.net/test/read.cgi/tech/1408743258/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1417179292/

次期規格C++1yはこちら
C++14/C++1z 20
http://peace.2ch.net/test/read.cgi/tech/1410382924/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
0002デフォルトの名無しさん2014/12/18(木) 13:48:36.76ID:Mboq20NA
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0003デフォルトの名無しさん2014/12/18(木) 13:49:19.44ID:Mboq20NA
----テンプレここまで----
0004デフォルトの名無しさん2014/12/18(木) 16:23:18.11ID:Xu+bpXu3
以下、質問禁止。
0005デフォルトの名無しさん2014/12/18(木) 21:09:31.54ID:k0ND7p5i
話題が広がる質問をするように(`・ω・´) シャキーン
0006デフォルトの名無しさん2014/12/18(木) 23:13:31.10ID:fnOUCw1n
シー++は今後どうなると思いますか?
0007デフォルトの名無しさん2014/12/19(金) 00:12:58.73ID:NqAoL8i0
C++使いが皆ハゲる。ただハゲ散らかさない。C++ってそういうもんだ
0008デフォルトの名無しさん2014/12/19(金) 02:14:24.67ID:D9g9ciFN
C++の異端児、C++/CLIも此処で良いですか
0009デフォルトの名無しさん2014/12/19(金) 06:48:52.77ID:6yiRzMRA
くだすれC++/CLI(初心者用)part2
http://peace.2ch.net/test/read.cgi/tech/1268613679/
0010デフォルトの名無しさん2014/12/19(金) 06:55:16.41ID:XHQPWWr/
C++を自分中心の規格に捻じ曲げようとするマイクロソフトの罠だから駄目
プログラミング初心者ににC++=C++/CLIという概念を植え付けてそれを多数派に
していこうとしている
>>8もその被害者の一人
0011デフォルトの名無しさん2014/12/19(金) 07:35:24.65ID:LnqskZcG
>>10
お前、使ったことないだろ
IDE なんて MS も嫌々やってるのがまるわかりのできだぞ
本気でやってるなら C# 並みにしてるわ w
0012デフォルトの名無しさん2014/12/19(金) 13:33:24.46ID:sTJegaK2
テラが当たり前のいまどきIDEなんてどこの世界に生きてんだよ
0013デフォルトの名無しさん2014/12/19(金) 21:13:49.42ID:rAA+xYtY
ギガの時代は終わったもんな(^_^)ノ
これからはIDEじゃなくてIoT(InternetOfThings)だよ(>_<)
0014デフォルトの名無しさん2014/12/19(金) 23:49:49.30ID:wb+cst2b
>>12-13
0015デフォルトの名無しさん2014/12/20(土) 11:50:50.19ID:jR1T/TYI
C++で巨大なデータをプログラムに埋め込むにはどうしたらいいのですか?
0016デフォルトの名無しさん2014/12/20(土) 12:15:35.44ID:/dRkMF5D
>>15
元のデータが何なのかにも夜が、良くやるのは既存のバイナリファイル(これがデータに該当する)をchar配列のC構文に自動変換する方法
0017デフォルトの名無しさん2014/12/20(土) 12:24:13.66ID:JZ4PykH5
objcopyで
0018デフォルトの名無しさん2014/12/20(土) 12:33:11.89ID:NV7bMuJA
テキストファイルを文字列として #include ってできない?
R"(#include "data.txt")" みたいなことがやりたい。
0019デフォルトの名無しさん2014/12/20(土) 13:19:55.03ID:/dRkMF5D
>>18
引用符で括った段階で意味変わっちまうからな
せめてカンマ区切りの16進ダンプになってればどうにかなるんだろうが

自前の変換ツールかいてみたらどーよ
数10行で書けるし
0020デフォルトの名無しさん2014/12/20(土) 13:23:25.97ID:lS6KGt9L
>>16
規格で保証されてる1オブジェクトのサイズは32KBとか64KBとか、そんなもんだったはず。
まぁ、分割しておいてプログラム側で組みたてりゃいいが。
0021デフォルトの名無しさん2014/12/20(土) 14:12:40.26ID:fOhVUgIO
>>20
32bitの組込用コンパイラだけど、100KB越えのchar配列は宣言出来たよ
0022デフォルトの名無しさん2014/12/20(土) 15:40:59.86ID:nd4W1El1
そりゃ何100MBだって出来るわな
>>20
C++規格にそんなのあるの?
0023デフォルトの名無しさん2014/12/20(土) 15:56:11.84ID:cUhMXe+F
インクルードのネスト数とか識別子の文字数とか、最低これだけは行けるよねっていうのが色々決まってたはす
0024デフォルトの名無しさん2014/12/20(土) 16:09:48.06ID:UAEy/4JW
C++コード自動生成のコンソールアプリ書けば自由度高いよ、コマンドライン引数で 付けて汎用化すれば再利用性も高い
0025デフォルトの名無しさん2014/12/20(土) 16:12:13.89ID:g/UZFBu6
ELFにリソースとして持たせればいいだけだろ
0026デフォルトの名無しさん2014/12/20(土) 16:50:31.13ID:lS6KGt9L
ああすまん、いろいろ間違ってたわ。

制限値はあくまでも実装定義で、規格にあるのはその推奨値だな。
C++11だと Annex B にオブジェクトサイズ260KB、文字列リテラル64KBとある。

それと、自分が以前引っかかったのは文字列リテラルの方の制限だった。
GIMPで一定サイズ以上の画像をCソース形式でエクスポートするとコンパイルできない
ことがあったんだが、そいつを勘違いした。
0027デフォルトの名無しさん2014/12/20(土) 17:03:57.61ID:UAEy/4JW
いずれにしても>>18のような方法は無理かと
objcopyなり自作するなりしてCソース生成するか、環境が許せばELFリソースとして取り込むか
0028デフォルトの名無しさん2014/12/20(土) 17:34:11.78ID:MvUnc9qy
昔、どうやったか覚えてないが
exeの後ろにバイナリでくっ付けて、何かの情報を読んでそのデータを読み出して使う
なんてことやったことがあるな。
0029デフォルトの名無しさん2014/12/20(土) 18:03:34.67ID:UAEy/4JW
>>28
exeつうことはDOSかWINなんだろうけど、exeの後ろをインチキして延長した部分はプログラムからはどう見えるの
0030デフォルトの名無しさん2014/12/20(土) 18:05:05.16ID:UAEy/4JW
てゆかWIN EXEならユーザー定義リソースとして正規の方法でEXEにバインドできるよな、多分質問者のはそういう事では無いんだろう
0031デフォルトの名無しさん2014/12/20(土) 18:29:45.99ID:gQF4xUpT
>>29
インチキの仕方によるだろ
0032デフォルトの名無しさん2014/12/20(土) 18:37:13.04ID:MvUnc9qy
exeヘッダーにサイズ情報が入っていたと思う
0033デフォルトの名無しさん2014/12/20(土) 19:00:07.56ID:F6eJQs21
たしか、自分で必要な部分を読み込むんじゃないっけ?exe直接開いて。
そんな話をおれも聞いたことある。
dosの時代
0034デフォルトの名無しさん2014/12/20(土) 19:55:07.52ID:SDWeWTgE
めんどくさいから static でべたべたつけていけばいい
0035デフォルトの名無しさん2014/12/20(土) 21:57:43.10ID:UAEy/4JW
>>33
ビルドした後にいちいちもう一段手数踏むのか、デバッグめんどくさそうだ
0036デフォルトの名無しさん2014/12/21(日) 17:23:02.94ID:FZbFM7/v
静止画像ならxpmで普通にincludeして処理
バイナリならコンパイル後catで結合
コードはexeファイルをバイナリモードで開いて「ファイルの最後-結合するデータサイズ」にファイルポインタセットして読み込み
0037デフォルトの名無しさん2014/12/21(日) 17:29:19.07ID:FZbFM7/v
あと確認のためデータの先頭にマジックワード入れとくこと
0038デフォルトの名無しさん2014/12/21(日) 17:32:56.00ID:FZbFM7/v
ウィンドウズの場合はリソースファイルにバイナリファイルを記述してしてAPIからリソースID指定してデータ読みこめた気がする
0039デフォルトの名無しさん2014/12/21(日) 17:38:33.47ID:e2fIb+kJ
>>36
>exeファイルをバイナリモードで開いて
これをやるのが一番めんどくさそうだ、ファイルパスとかどうやって手に入れるの?

>>38
リソースはロードしてロックしてとかめんどくさそうなんだけれど‥static で持たせたらなにもせずにアクセスし放題だよ‥
0040デフォルトの名無しさん2014/12/21(日) 17:47:26.03ID:6WeMGJJt
>>39
リソースのロードとロックなんて簡単だろ。 exe自身に含められる上、アンロックは無いし。

なんにせよ、C++の素の機能では実行ファイルに外部データを埋め込むことはできないのな。
0041デフォルトの名無しさん2014/12/21(日) 17:50:50.33ID:2iwIfbgZ
>>36のいうexeパッチはトリックの部類に入るが、>>38のユーザー定義リソースはWinに元々ある手法でトリックでもなんでもない
0042デフォルトの名無しさん2014/12/21(日) 18:38:09.07ID:FZbFM7/v
データcatするのはVisualStudioの最後にリソースデータを実行ファイルにマージするのと同じ
データcatする手法使いたいけどそれが手間ってんならmakeやVSのビルドコマンドにぶち込んどけ
0043デフォルトの名無しさん2014/12/21(日) 19:05:38.10ID:2iwIfbgZ
VS使うってことはWin限定なんだからユーザー定義リソースでいいんじゃないか
0044デフォルトの名無しさん2014/12/21(日) 21:22:22.55ID:OJR2IhJw
objcopyってgcc系ツールだろ。VCで作成しているのにobjcopyを使って埋め込むのか?
たとえばgcc系のmingwでwinソフト作成していても、データを埋め込む時はリソースファイル
に記述して埋め込むんじゃないのか?

リソースファイル使わないで強制的にexeの後に埋め込んで使うって、
どういう場合なんだ? リソースファイル記述では巨大ファイルは埋め込めないとか
0045デフォルトの名無しさん2014/12/22(月) 01:48:03.02ID:+BOkQn0H
>>44
WIN32以降はリソースセクションのサイズ制限は無かったと思う
0046デフォルトの名無しさん2014/12/22(月) 12:43:41.32ID:SmxPQr0l
GIOに実行ファイルにリソースを追加するAPIがあったな
https://developer.gnome.org/gio/stable/gio-GResource.html
C++とは何の関係もないが
0047デフォルトの名無しさん2014/12/22(月) 15:31:59.76ID:O5kTxGCI
>>15
巨大って何Gバイトとかのオーダーか?
0048デフォルトの名無しさん2014/12/23(火) 00:22:06.66ID:BmzYTsD1
まあ普通はEXEの脇に目的のデータファイルおいとけば済むような話なんだけどね、セットアッププログラムが忘れずにそれを配置すればいいんだから

それともデータファイルが単独で見えたら困る理由でも有るのかな
0049デフォルトの名無しさん2014/12/23(火) 00:25:42.07ID:BmzYTsD1
プログラミングの悩みに国境なんて無いんだし、人の出入りの多い英語版で十分だろ
0050デフォルトの名無しさん2014/12/23(火) 00:58:34.70ID:ZhKtxXT7
exeを一つコピーするだけで動けば手軽だよね
インストーラーとか何も気にする必要が無いし
0051デフォルトの名無しさん2014/12/23(火) 01:00:27.89ID:BmzYTsD1
MFCにしろQtにしろEXE単体で持ち込んでもどうにもならないから、結局セットアップ組まないと人に渡せない
0052デフォルトの名無しさん2014/12/23(火) 01:06:14.31ID:ZhKtxXT7
確か、VC6.0でMFC使わないコマンドラインアプリだと、
CのランタイムがOSにプリインストールされているんで、
exe単体で配布出来た記憶が有る
0053デフォルトの名無しさん2014/12/23(火) 01:10:09.62ID:BmzYTsD1
msvcrt.dllか
XP以降だと居るね
しかしVC6.0って、初版からもう16年も経ってるよw
0054デフォルトの名無しさん2014/12/23(火) 01:21:26.39ID:563YOSgG
うちは現役バリバリだがw
0055デフォルトの名無しさん2014/12/23(火) 01:50:29.25ID:JtDLB+nl
今時VC6が現役かのような話をし出す人は
10年後も同じことを言っているに違いない。
一生脳みそが進化しない人たち
0056デフォルトの名無しさん2014/12/23(火) 01:58:08.01ID:3P5/e2xd
まぁ、サポートを25年結ばせた製品もあるので文句は言えない
装置が動かなければ文句は言うけど
0057デフォルトの名無しさん2014/12/23(火) 02:56:42.09ID:BmzYTsD1
Macみたいなアプリ構造だと簡単に外部データファイル忍び込ませて、見かけ上ひとかたまりのアプリに見せかけれるんだよなあ
0058デフォルトの名無しさん2014/12/23(火) 03:50:42.80ID:JpaksaBx
ドッグイヤーなIT業界で25年は途方もなく長い……
0059デフォルトの名無しさん2014/12/23(火) 04:04:39.78ID:BmzYTsD1
今から25年後は2039年か
その前に2038年問題を乗り越えなくちゃ
0060デフォルトの名無しさん2014/12/23(火) 06:56:41.49ID:ZhKtxXT7
>>55
会社でやってると、別に自分の意思なんて関係ないぞ
個人的には、C、C++、C#、SQLとか、Azureなんかも少し勉強しているし、
IDEとしてはCommunityを入れているが、
"当時"の製品を保守していくのに、VC6.0も入れないといけないんで
0061デフォルトの名無しさん2014/12/23(火) 09:27:39.48ID:BmzYTsD1
まあ新規案件でVC6は無いね
64bitも生成できないしMFCも古いし
0062デフォルトの名無しさん2014/12/23(火) 10:14:57.29ID:S/HWfghB
>>52
静的リンクすりゃいいんじゃね?
MFC はできないんだっけ?
0063デフォルトの名無しさん2014/12/23(火) 12:54:35.99ID:BmzYTsD1
>>62
出来るけど、クソでかく成る
MFC無しのコンソールアプリとかなら静的リンクしても小さいんだけど
0064デフォルトの名無しさん2014/12/23(火) 12:59:56.43ID:zn+tl5Qa
>>63
デカイと言っても数メガバイト程度じゃあないか?
0065デフォルトの名無しさん2014/12/23(火) 13:03:00.57ID:EhLsW63J
さすがに
VC6が現役バリバリ ≠ 新しい製品は使っていない
だろ
0066デフォルトの名無しさん2014/12/23(火) 13:07:22.00ID:CttU++jz
まあVB6もそういう意味じゃ現役
流石に今はそれで製品は作らないけど、ちょっとした自分用ツール作るのには軽くて楽

バッチ処理用のツールはC++2013でコンソールアプリにするけどね
0067デフォルトの名無しさん2014/12/23(火) 14:40:52.35ID:S/HWfghB
>>66
ちょっとしたツールなら C# で十分
VB6 は文字コードの扱いが面倒だし
0068デフォルトの名無しさん2014/12/23(火) 16:29:16.63ID:zkNCry36
C#でなくVB6という機能性の低い言語で使い捨てツール作る人は
間違いなく老害
またの名をブビ厨
0069デフォルトの名無しさん2014/12/23(火) 16:36:32.79ID:ATuB6kuL
きょうびの ExcelVBA はどうなっているかの〜?
0070デフォルトの名無しさん2014/12/23(火) 16:47:09.04ID:T7GjWYCO
>>69
今も普通にVB6互換のインタプリタだよ
0071デフォルトの名無しさん2014/12/23(火) 18:11:47.47ID:ATuB6kuL
じゃあ次の VBA は C# になるんだね,これは随分と楽しみだ‥
0072デフォルトの名無しさん2014/12/23(火) 18:42:56.49ID:3P5/e2xd
そこに颯爽と xlwings が!
およびでない?およびでない?
0073デフォルトの名無しさん2014/12/23(火) 18:45:22.55ID:T7GjWYCO
>>71
ならないよ
VB6がVB.NETになって早12年
その間VBAはVB6アーキテクチャーのまま変わらなかった
0074デフォルトの名無しさん2014/12/23(火) 22:10:04.89ID:yx1q+yG3
>>72
へ〜、こんなこともできるんだ‥個性の強い言語でやってくんないかな‥haskell とか‥
0075デフォルトの名無しさん2014/12/23(火) 22:51:43.86ID:EhLsW63J
自分は一介の事務員なんで、仕事のツールはC++で作るもののフロントエンド(GUI)は無理なのでExcelVBAばっかりだ。
VBAがC#になったらどうなるんだろう?
0076デフォルトの名無しさん2014/12/23(火) 22:54:32.47ID:27luq57f
「事務員がツールをC++で」
「事務員がExcel VBAをシコシコ」
一番迷惑なパターンだな
0077デフォルトの名無しさん2014/12/23(火) 22:54:46.13ID:ZhKtxXT7
一介の事務員だったら、フロントエンドはC#で作るのが一番楽じゃないのか?
0078デフォルトの名無しさん2014/12/23(火) 23:01:43.83ID:BmzYTsD1
>>75
Excel自体も.NETになっていて糞遅いVBAになってるだろう、しかも既存のExcelマクロも言語仕様の違いで動かない
0079デフォルトの名無しさん2014/12/23(火) 23:12:16.94ID:EhLsW63J
>>76
迷惑って、他人とどう関係があるのか?
それにExcelVBAをシコシコって事務員のデフォルトではないか?
0080デフォルトの名無しさん2014/12/23(火) 23:15:07.53ID:EhLsW63J
ロジックの中心となる部分をVBAで書くのはかったるいし、何よりつまらない。
ツール全体をC++で作るのは技術もないし、なによりかったるい。
0081デフォルトの名無しさん2014/12/23(火) 23:27:16.44ID:BmzYTsD1
>>80
VC++/ATLでCOMベースのDLLを書き、それをVBAから使う、というのがよく使う手法
0082デフォルトの名無しさん2014/12/23(火) 23:30:17.59ID:3wq9WRg2
もはやウイルスです
0083デフォルトの名無しさん2014/12/23(火) 23:57:24.52ID:EhLsW63J
>>81
Microsoftテクノロジーにはいまいち関心が湧かないので自分はCOMベースにはしていませんね。
なんというか、素のdll。
そのへんは人によってさまざまだとおもう。
0084デフォルトの名無しさん2014/12/24(水) 00:01:01.27ID:BmzYTsD1
素のDLLにせよCOMにせよ、VBAが.NETではない所にポイントがあるんだよな
OfficeマクロはC#とかには絶対に成らないで欲しい
0085デフォルトの名無しさん2014/12/24(水) 00:05:01.61ID:7o13BBmg
コムでもWinAPI呼び出しでもいいから、
俺の64ビットExcelから呼び出せるように作れよ。
フォーマットエラーで落ちるなよ
0086デフォルトの名無しさん2014/12/24(水) 00:05:43.89ID:taMbM64E
>>84
そうそう
VBAというかExcelは単なる入出力装置で、とっととデータをC++側に取り込んでしまって、あとは優雅に処理したい。
データのやり取りはVAB配列で十分だし、safearrayがらみの決まりきった手順は変えたくないんだよね。
0087デフォルトの名無しさん2014/12/24(水) 00:05:45.53ID:iAWb/cKM
ならんだろうな。今までのユーザ資産が尋常じゃないぐらい有るから。
有るとすれば、Excelじゃない新製品とか?
0088デフォルトの名無しさん2014/12/24(水) 00:07:06.94ID:taMbM64E
>>85
俺は一介の事務員だから他人のためのツールなんか作らん。
0089デフォルトの名無しさん2014/12/24(水) 00:08:36.68ID:6WAQclhg
>>85
Excelって今は64bitビルドなの?
2007以降買い換えてないから知らなかったんだけど
0090デフォルトの名無しさん2014/12/24(水) 00:17:25.96ID:ndV3e2Ga
>>89
Office 2010から32と64の両方がある。
64のsetup.exeを実行しない限り32が入る。
0091デフォルトの名無しさん2014/12/24(水) 00:27:34.81ID:6WAQclhg
>>90
そうなのか、知らなかったサンクス
そうすると疑問が湧いてくるのはVBAエンジンの仕様

新しい64bit VBAでExcelと同じプロセス空間で動くのか、それとも従来通りの32bit VBAでプロセス間通信を駆使してExcelを制御するのか
0092デフォルトの名無しさん2014/12/24(水) 03:00:12.04ID:8ripkqoL
C++相談室だと思って来たらVBAの話してたでござる
0093デフォルトの名無しさん2014/12/24(水) 07:24:09.81ID:taMbM64E
>>92
意外とC++利用者の多くの部分は非開発者なんじゃない?
だとするとそんな使い方もけっこう主流なのかも。
0094デフォルトの名無しさん2014/12/24(水) 07:51:43.07ID:qF3zxr2Y
>>47
ペタバイトくらい
0095デフォルトの名無しさん2014/12/24(水) 08:27:30.54ID:8qOauR0w
最速SSDでもシーケンシャル1,000MBi/Sec
ペタとなるとデータを舐めるだけでも 22,500時間≒940日≒ 3年弱
0096デフォルトの名無しさん2014/12/24(水) 09:05:56.86ID:TctVZDZ1
>>95
RAID-0 も知らんのか
0097デフォルトの名無しさん2014/12/24(水) 11:54:37.10ID:rAxAPjJR
>>76
お前よりは有能だよ
0098デフォルトの名無しさん2014/12/24(水) 18:28:03.85ID:SBMAfTrT
>>95
計算違わないか?
1PiB=1,048,576GiB
1GiB/sなら100万秒=12日じゃないの。
実際は1GiBあたり10〜30秒ほどかかるだろうから1年弱か
0099デフォルトの名無しさん2014/12/24(水) 21:13:56.59ID:z2dSDQxc
>>93
>C++利用者の多くの部分は非開発者なんじゃない?
何をわけのわからんこと言ってるんだおまいは
0100デフォルトの名無しさん2014/12/24(水) 21:59:30.41ID:taMbM64E
>>99
仕事で使うプログラムをC++で書いている人の多くは、「いわゆる職業プログラマー」以外の人ではないだろうか?

、と書けば理解できるか?
0101デフォルトの名無しさん2014/12/24(水) 22:14:40.33ID:CYhtUQ39
事務員はExcelから呼び出す処理をC++でプログラミングするのがデフォルトで
それがC++言語の主な使われ方であるとふむふむ
0102デフォルトの名無しさん2014/12/24(水) 22:29:20.50ID:taMbM64E
>>101
事務員はそのさらに一部だろうが。何を言ってるんだ?
「いわゆる職業プログラマー」ってのはSIerやソフト開発会社に勤めてプログラマーを名乗っている人を指すんだろう。
それ以外は文字通り「それ以外の人」に当たるわけで、それが5割以上いればいいだけじゃないか。

おまえら昭和の時代から来た人たちなのか?
0103デフォルトの名無しさん2014/12/24(水) 22:46:53.20ID:o8tVCazP
事務員はカーネルのパッチをしたりデバイスドライバー書く仕事なのか、ふむふむ
0104デフォルトの名無しさん2014/12/24(水) 23:13:12.25ID:tTQk+YUl
俺一応職業プログラマ名乗ってるけどカーネルのパッチしたりデバイスドライバー書いたことないし、そういうのって事務員がやってたんだな
0105デフォルトの名無しさん2014/12/24(水) 23:17:06.93ID:taMbM64E
事務員は計算をするんだよ。
一人1台PCを持たされて、EUC用のDBは用意されてて、Expressだったら申請すれば入れてもらえる。
セキュリティ上の問題さえなければ自由なんだし、これでどうして自分用のツールを作らないと思うんだ?
理系で若けりゃ言語のひとつくらい知ってるし、C++は比較的多い部類だよ。もちろんVB/VBAが圧倒的だが。
0106デフォルトの名無しさん2014/12/24(水) 23:22:59.52ID:+1mcRXwz
まあなんだかんだいってふつう、ふつうに C++ に進むしね‥
0107デフォルトの名無しさん2014/12/24(水) 23:52:51.73ID:taMbM64E
誤解があるとアレだから断るけど、事務員ってのは営業は含まないよ。
営業はさすがにプログラムなんか書かない。

あとシステム部門も除外。
なんというか・・・プログラミングなどしない層がシステム部門に集まってる感じwww
0108デフォルトの名無しさん2014/12/25(木) 17:46:00.35ID:JcI9w082
最近はアビバでもC++が増えてきてるよね
0109デフォルトの名無しさん2014/12/25(木) 19:33:01.61ID:X2VFu+qz
ふと気づいたらデストラクタにvirtualとか書かなくなってた。
ちょっと前まではデフォルトでそうしてたけどなあl。
0110デフォルトの名無しさん2014/12/25(木) 19:38:56.63ID:pPXFAV2W
>>109
代わりに何書くの?なんか新しいキーワードできたん?
0111デフォルトの名無しさん2014/12/25(木) 20:24:20.43ID:1LrWAMeK
↑アスペ
0112片山博文MZ ◆T6xkBnTXz7B0 2014/12/25(木) 20:24:56.17ID:gEw73of1
>>110
スマポあれば仮想dtor要らねーよって話
0113片山博文MZ ◆T6xkBnTXz7B0 2014/12/25(木) 20:28:24.89ID:gEw73of1
std::array::data()はサイズの情報を返さないからARRAY_SIZEマクロ使えねー
0114デフォルトの名無しさん2014/12/25(木) 20:33:45.55ID:JhLNRnCp
デストラクタをvirtualにするパターンをvirtualにしないパターンがあるってだけだよ

デストラクタをvirtualにするパターン
仮想関数テーブルを持ち、new(あるいはmake_sharedなど)で確保して基底クラスにキャストし、基底クラスのポインタをdeleteする可能性があるクラス

デストラクタをvirtualにしないパターン
継承されない、あるいは継承されたとしても基底クラスにキャストしてdeleteを行わないクラス
なおC++11では継承されないクラスにはfinalを付けることができるようになった

スマポがあればデストラクタはいらない? 確かに後者のパターンならそうだ
しかし、前者のパターンであれば、実体を書かずに=defaultとしてしまってもいいが、virtualをつけたデストラクタは書く必要がある
0115デフォルトの名無しさん2014/12/25(木) 20:38:33.24ID:iVu6887z
shared_prなら大丈夫
0116デフォルトの名無しさん2014/12/25(木) 20:49:30.26ID:JhLNRnCp
あ、そうか、shared_ptrだとアロケータ持ってるから大丈夫か
0117デフォルトの名無しさん2014/12/25(木) 20:59:28.89ID:JE3+431H
どういうこと?>shared_ptr
0118デフォルトの名無しさん2014/12/25(木) 21:03:34.38ID:kEJw445D
shared_ptrに最初に格納するときの型が実際の型であれば、virtualなデストラクタは要らないんだな
0119デフォルトの名無しさん2014/12/25(木) 21:10:25.77ID:JE3+431H
そういうことか・・・
でも普通は何らかの基底型でまとめちゃう気がするけど

あとメンバー変数を増やさない継承もvirtualいらなかったりする?
0120デフォルトの名無しさん2014/12/25(木) 21:14:02.14ID:GL+VZ+hl
このページにあるvJoyInterface.dllの使い方がいまいちうまく行かず、困っています。
http://vjoystick.sourceforge.net/site/index.php/dev/89-modifying-the-installer

HMODULE hLib = LoadLibrary(_T("vJoyInterface.dll"));でライブラリは読み込めたのですが

GetProcAddressで中から関数の取り出しが失敗してしまいます。

typedef BOOL (*FUNC)(void);で宣言して
FUNC lpFunc = (FUNC)GetProcAddress(hLib, "is_vjoy_installed");で取り出すというのはおかしいでしょうか
0121デフォルトの名無しさん2014/12/25(木) 21:17:41.18ID:JhLNRnCp
呼び出し規約__stdcallなんじゃねぇのこれ
0122デフォルトの名無しさん2014/12/25(木) 21:22:01.18ID:GL+VZ+hl
>>121
DLLを使うということ事態、よくわからないので、__stdcallとはなんなのか教えてください。
0123デフォルトの名無しさん2014/12/25(木) 21:30:30.87ID:amq1PajC
unique_ptrには、virtualなデストラクタが必要じゃなかったっけ?

もしこれが本当なら何でだろ?

sharaed_ptrにはvirtualデストラクタが要らなくて,unique_ptrには
virtualデストラクタが必要と言うのならその理由はなんだろう?

まさか、整備が遅れてる?そんなバナナ
0124デフォルトの名無しさん2014/12/25(木) 21:43:42.74ID:gEw73of1
>>117
時間があれば、ソースやレファレンスでも読んでろ
0125デフォルトの名無しさん2014/12/25(木) 21:51:55.82ID:JhLNRnCp
>>122
M$のコンパイラの呼び出し規約の一つ
普通のC関数は_cdeclで、関数呼び出した側が積んだスタックを戻す
__stdcallは呼び出された側がretの時に積まれた分のスタックを戻す
呼び出し規約違うのを無理やり呼ぶとスタックが壊れるから別の名前にマングリングされる
Win32APIだと
#define WINAPI __stdcall
ってなってるから、WINAPIで宣言された関数はみんな__stdcall関数になる
__stdcallが付けられた関数はdllexportされた時に
_関数名@X
って名前になるから(Xは引数が消費するスタックのサイズ)、GetProcAddresに渡す名前もそうしなきゃいけない
ちなみに、FUNCのtypedefもWINAPI付けたものにしないと多分死ぬよ

>>123
俺もそこら辺の細かい実装どうなってたっけと思って調べてみたけど、default_deleteは単純にdeleteする仕様だからvirtual付けないといけないみたい
多分、unique_ptrはshared_ptrと違って、生のポインタを扱うのとパフォーマンスに差が出ないような設計になってるんじゃないかな
0126デフォルトの名無しさん2014/12/25(木) 21:52:19.93ID:TJm+7M94
>>120
読み込むDLL自体間違ってるしC++関係ないし
0127デフォルトの名無しさん2014/12/25(木) 21:57:00.80ID:GL+VZ+hl
>>126
あ、失礼しました。

>>125
あざす
0128デフォルトの名無しさん2014/12/25(木) 22:01:48.21ID:GL+VZ+hl
すいません。普通に読み込めたようです。お騒がせしました
0129デフォルトの名無しさん2014/12/25(木) 22:11:42.45ID:XFKTSJbC
馬鹿ほど長文が好きだな。
宣言が
BOOL WINAPI �get_inf_file(TCHAR * InfFile);
なんだから
typedef BOOL WINAPI (*FUNC)(TCHAR * InfFile);
にしろ。と言えばいいだろう

>dllexportされた時に _関数名@X って名前になるから
どこの糞ライブラリだよそんなアホなことするのは
0130デフォルトの名無しさん2014/12/25(木) 22:17:39.52ID:EvzfwKHq
コムパイルエラー。
using FUNC = BOOL (WINAPI *)(TCHAR * InfFile);
が正しいな。
0131デフォルトの名無しさん2014/12/25(木) 22:22:10.66ID:pPXFAV2W
>>112,114
普通に目から鱗だった
呼ぶべきデストラクタを他の実体(shared_ptrとか)が覚えてるような状況ではvirtualはイランってことで、
C++11的なコードではその状況が一般的ってことか。
0132デフォルトの名無しさん2014/12/25(木) 22:24:36.47ID:y44O8lon
>>119
派生型でデータメンバー増やしたかどうかは関係ないよ、派生型で追加のデストラクション処理があるかどうか。

データメンバー増やしてもintみたいのは自然に任せておけばいいし、データメンバー増やさなくても派生型でのdtorで何か追加の処理が必要ならvirtualが要る。

例えば外部に通信で何か送るとか、重要なリソースの復帰手続きがいるとか。
0133デフォルトの名無しさん2014/12/25(木) 22:34:36.97ID:JhLNRnCp
>>129
M$の糞ライブラリだよ、試してみろよ


__declspec(dllexport) void __stdcall test1(void) {}

__declspec(dllexport) void _cdecl test2(void) {}

これを cl /c でコンパイルして出来たobjファイル見てみろ

_test1@0

になってなかったら謝るわ
0134デフォルトの名無しさん2014/12/25(木) 22:36:16.31ID:YrgD4jS6
デストラクタを持つメンバーを追加したときも必要だし、特に強い理由がなければつけといた方が無難ではあるね。
そのクラスの使い方変えてリークさせないとも限らないし、それをコンパイルエラーにする仕組みも無いし。
0135デフォルトの名無しさん2014/12/25(木) 22:37:22.63ID:HdmTbtKU
必要が無いなら絶対にvirtualデストラクタは作るな
0136デフォルトの名無しさん2014/12/25(木) 22:43:28.37ID:kLGZywI8
class に final 付けておきました!
0137デフォルトの名無しさん2014/12/25(木) 22:43:47.88ID:X2VFu+qz
>>135
絶対ってことはないけどさ...

昔 : 実装継承は悪手。インターフェース継承に備えてvirtualが基本。デストラクタでは必須!
今 : 継承させるぞって明確なもくろみがなければクラスの派生なんてしない

っていう感じになってきた。
0138デフォルトの名無しさん2014/12/25(木) 22:44:11.94ID:y44O8lon
派生しない事が明らかな場合だけvirtualを省略してもよいが、それ以外は原則virtual

interfaceにもvirtual

interface IFooBar {
...
virtual ~IFooBar() {}
};
0139デフォルトの名無しさん2014/12/25(木) 22:47:14.74ID:iVu6887z
CRTPとか継承していてもvirtualつけなくてもいいパターンも
0140デフォルトの名無しさん2014/12/25(木) 22:48:10.77ID:vBicrBA8
>>133
それはMSのライブラリじゃなくて君の糞ライブラリだろう
まさか>>128がマングリ名で解決したと思ってるの?
0141デフォルトの名無しさん2014/12/25(木) 22:48:51.28ID:X2VFu+qz
>>138
ちょっと観点が違うかな。

原則派生はしない。だからvirtualは付けないのがデフォ。
継承させるつもりがあるときは、そういう明確な計画のもとにやる。

あんたのは頭に I を付けてるから、まあ同じことを言ってるのかもしれない。
0142デフォルトの名無しさん2014/12/25(木) 22:50:17.00ID:gcGcIdF4
>>134
>デストラクタを持つメンバーを追加したときも必要だし

何故?
0143デフォルトの名無しさん2014/12/25(木) 22:51:24.92ID:X2VFu+qz
まあ少なくとも、派生クラスを作る「かもしれない」とか、
デストラクタにvirtualが付いてないだけで「こいつ分かってない」
なんていう時代は去った。
0144デフォルトの名無しさん2014/12/25(木) 22:54:37.17ID:YrgD4jS6
>>134
俺はinterfaceにvirtualデストラクタは無いかな。
interfaceで渡すような物は所有権持たないようなスマートポインタでいうならweak_ptrで渡すようなものに限定してinterfaceをdeleteする事は無いし。
寿命管理するためのinterfaceってのを作るなら入れるだろうけど、今の所そういうものを作ったことが無い。

>>142
>>134 は >>132 とかその元の >>119 からの流れな。
0145デフォルトの名無しさん2014/12/25(木) 22:58:34.09ID:y44O8lon
IBase* base = new Derived();
..
delete base;

みたいな時は?
0146デフォルトの名無しさん2014/12/25(木) 23:08:21.35ID:N5DAFkoT
>>145
そんな非常識なコードを書く人は
夜道で刺し殺されても仕方ないだろうね
0147デフォルトの名無しさん2014/12/25(木) 23:11:05.49ID:N5DAFkoT
とは言え、ハーブサッターは
「auto base = shared_ptr<IBase>{ shared_ptr<Derived>{new Derived{}} };
がわかりやすくてオススメ」
と言っていた気がするが、長すぎる
0148デフォルトの名無しさん2014/12/25(木) 23:11:34.76ID:y44O8lon
>>146
どう非常識なのかわからんわ
普通にあるだろ
変数は抽象型でオブジェクトはその時々のどれかの具象型ってのは

インーターフェースベースの記述した事ないんかい
0149デフォルトの名無しさん2014/12/25(木) 23:16:58.27ID:pPXFAV2W
>>145
virtualが必要になる典型例でかつshared_ptr使えよって弄られる典型例じゃね?
0150デフォルトの名無しさん2014/12/25(木) 23:19:13.83ID:uEY+MDR3
>>147
make_sharedつかえば少し短くなる
0151デフォルトの名無しさん2014/12/25(木) 23:19:40.05ID:y44O8lon
shared_ptr(或いはunique_ptr)に指定するテンプレ型が抽象型で実際にnewするのは具象型、だったら同じじゃね?
0152デフォルトの名無しさん2014/12/25(木) 23:21:35.26ID:hS0cw+d6
>>151
>>123読んだ?
0153デフォルトの名無しさん2014/12/25(木) 23:22:25.15ID:X2VFu+qz
ていうかBase-Derivedから脱却せえよW
0154デフォルトの名無しさん2014/12/25(木) 23:24:19.46ID:y44O8lon
>>153
変数の型とnewする型が同じとは限らないからvirtual dtorが要るか要らないかの話になってるわけで
0155デフォルトの名無しさん2014/12/25(木) 23:25:21.45ID:hS0cw+d6
>>123
>sharaed_ptrにはvirtualデストラクタが要らなくて,unique_ptrには
>virtualデストラクタが必要と言うのならその理由はなんだろう?

そりゃデリーターをtype-erasureするにはnewが要るからねぇ。
スマポのコンストラクターで例外が出るような作りを
なるべく避けたかったんだろう
0156デフォルトの名無しさん2014/12/25(木) 23:26:09.55ID:uEY+MDR3
>>154
shared_ptrのコンストラクタを見て来いよ
0157デフォルトの名無しさん2014/12/26(金) 00:00:28.79ID:BylUSmvJ
インターフェースクラスはvirtualデストラクタを定義して
ポリモーフィック型にしとけよ

でないとクロスキャストできないだろ
0158デフォルトの名無しさん2014/12/26(金) 00:03:05.35ID:8z4xGjwP
>>157
何がインターフェースクラスになるの?
0159デフォルトの名無しさん2014/12/26(金) 00:19:17.91ID:KoiWwuqz
クロスキャストが必要なインターフェースとか無いわ。設計狂っとる。
0160デフォルトの名無しさん2014/12/26(金) 00:23:59.33ID:oJENaxkL
で、Baseが仮想dtorを持たないと仮定して

shard_ptr<Base> obj(new Derived);
だと、スコープから抜ける時Derivedのdtorは呼ばれる

unique_ptr<Base> obj(new Derived);
だと、スコープから抜ける時Derivedのdtorは呼ばれない

sharedの場合でも
Base* obj = new Derived;
shard_ptr<Base> base(obj);
だと、スコープから抜ける時Derivedのdtorは呼ばれない
0161デフォルトの名無しさん2014/12/26(金) 00:44:22.29ID:oJENaxkL
このstd::shared_ptrのdtor呼び出しのマジックを誰か説明してくれ
0162デフォルトの名無しさん2014/12/26(金) 00:55:37.19ID:rmtyj285
template <typename T_1, typename T_2>
Ptr<T_1>::Ptr(T_2 *p)
0163デフォルトの名無しさん2014/12/26(金) 01:03:55.61ID:8z4xGjwP
>>161
いまVC2013で実装追ってみたけど、平凡だったよ。
shared_ptr<base>のコンストラクタはテンプレートメソッドになっていて、derived* を渡したときは
_Ref_count<derived>という型のオブジェクトがnewされてメンバとして設定されてる。
_Ref_count<derived>のデストラクタはもちろんderivedを正しくdeleteできる。

キモは「コンストラクタがテンプレートメソッドになっている」ということだけに見えるがね。
0164KUSO KOTE ◆unko./w.Osri 2014/12/26(金) 08:26:57.02ID:JEFGxAPQ
>>161
shared_ptr<T>クラスのテンプレート引数は
保持するオブジェクトの型だけですが、
その型とは関係なく
コンストラクターで受け取る型に対する解放処理も保持しています。
つまりshared_ptr<base>がDerivedの解放処理を保持していることがあります。

これはtype erasureという技で実現しています(たぶん)
↓こんな感じで
class 解放処理base {
 virtual void 解放(void *) = 0;
}
template<typename T> class ref_count : 解放処理base {
 virtual void 解放(void *) override;
};
0165デフォルトの名無しさん2014/12/26(金) 22:01:38.11ID:rxtr6QZy
お前らプログラマだろ。マイクロソフトで飯食ってるよな。
それなら文句は言えない。

でも、俺は学校関係者だ。俺の素性も公安か、しかるべきグループでわかってん
だろうけど。

でも、マイクロソフトの

Windows7→Windows8、8.1への様変更
officeの仕様変更
DirectX9→DirectX11, 13への仕様変更
kinectの仕様変更

には我慢できない。学校関係者はこんなソフト使いたくない。C#は一応、
規格委員会があるみたいだけど、こんなに兵器で仕様を変更する企業は
信用できない。

だれか、この投稿を英文に翻訳して本社に投げてくれ。
あ、。。。社員じゃ無理か
0166デフォルトの名無しさん2014/12/26(金) 22:08:38.70ID:bRYgZGxi
>>163
よくわかってないし、確かめてもいないんだが、

> derived* を渡したときは
> _Ref_count<derived>という型のオブジェクトがnewされてメンバとして設定されてる。

だとすると、基底クラスのデストラクタにvirtualの代わりになってないような?
base→derivedという二つの関係では動くが、
base→derived→derived2以上の関係では最初と最後しか呼ばれないような?
0167デフォルトの名無しさん2014/12/26(金) 22:15:56.05ID:y3Oe54D2
class base {
~base() {}
}
class derrived : public base {
~derrived() {}
}
class derrived2 : public derrived {
~derrived2() {}
}
で
derrived2* p = newderrived2;
delete p;

delete pされたら~derrived()は呼ばれないのか?
そんなわけないだろ
0168 ◆QZaw55cn4c 2014/12/26(金) 22:36:57.09ID:v5yuSvEQ
>>167
試してみればよかろう
http://codepad.org/lHt8KgMN
http://codepad.org/PNatNYgU
0169デフォルトの名無しさん2014/12/26(金) 22:40:26.15ID:y3Oe54D2
>>168
shared_ptrの話でvirtualの有無の話をしているのではない
0170デフォルトの名無しさん2014/12/26(金) 22:57:22.89ID:PVxYr/cw
shared_ptrのデリートの仕組みがわからなかった奴はこれでも読め
http://ideone.com/gtf72m
fack_ptrがもとの型を知らなくても正しくデリートできるのがミソだ
0171 ◆QZaw55cn4c 2014/12/26(金) 22:58:00.22ID:v5yuSvEQ
失礼した
http://ideone.com/L1IHCs
01721662014/12/26(金) 23:17:32.71ID:It92ug8g
http://ideone.com/YyBmxV

みんなすまん。問題ないっぽかった。
0173デフォルトの名無しさん2014/12/26(金) 23:18:52.47ID:It92ug8g
>>171
あっ…盛大にカブってしまった。ごめん。
0174デフォルトの名無しさん2014/12/26(金) 23:37:44.75ID:It92ug8g
>>170
とんくす!Uがいつの間に渡ったのかは謎だけど、
本質的には
delete static_cast<C*>(a);
これによってうまく呼んでいるようだね。
恥ずかしながら、このシンプルな挙動を今まで知らなかった。
まさかstatic_cast一発なんて。
0175デフォルトの名無しさん2014/12/26(金) 23:40:51.91ID:It92ug8g
もちろん
C *c = new C;
delete c;
これでデストラクタが全部呼ばれることも知らなかった…。

ぐっはぁ…。
0176デフォルトの名無しさん2014/12/26(金) 23:43:50.61ID:fnDLLhrS
C++風インタプリタでintなど型を省略してもしなくても動作する言語ありますか?
0177デフォルトの名無しさん2014/12/26(金) 23:46:33.18ID:58vHoNCu
javascript
0178デフォルトの名無しさん2014/12/26(金) 23:51:07.06ID:RziFNgWa
最近のjavascript処理系はインタプリタって言っていいのかもうわかんねえ
0179デフォルトの名無しさん2014/12/27(土) 00:10:22.07ID:2dHAjI9B
javascriptとC++だとだいぶ違うと思うんですが。
クラス型オブジェクト志向でなくクラス定義できず、それ以外でもほぼC++ソースをそのまま実行できない。
0180デフォルトの名無しさん2014/12/27(土) 00:12:47.00ID:fhkQhff2
C++「風」の定義を明確に
0181デフォルトの名無しさん2014/12/27(土) 00:15:27.39ID:rEUVsFml
CERNがスパコンでC++をインタプリタで実行してるとか
0182デフォルトの名無しさん2014/12/27(土) 00:15:49.37ID:2dHAjI9B
ほぼC++ソースがそのまま実行できて、intなど型を省略可能だといいんですが。
0183デフォルトの名無しさん2014/12/27(土) 00:17:19.88ID:YyzzLTt4
あんたが望むのはこの世にはないと思うよ
そういうことしてくれるプリコンパイラでも作れば
0184デフォルトの名無しさん2014/12/27(土) 00:26:45.49ID:RAnMs1TD
>>182
>クラス型オブジェクト志向でなくクラス定義できず

そこまで知ってるなら その質問は釣りだろ?
0185デフォルトの名無しさん2014/12/27(土) 00:33:04.65ID:klGGX/zS
cling
型省略はC++に既にあるだろ
0186デフォルトの名無しさん2014/12/27(土) 00:40:07.49ID:rEUVsFml
autoすら書きたくないんだろう
0187デフォルトの名無しさん2014/12/27(土) 00:40:43.90ID:iYMAmZHx
C++11のautoを知らないんだろう
0188デフォルトの名無しさん2014/12/27(土) 00:42:02.80ID:0F6lGnH7
表面上の言葉通りにとらえるとそうなるな
だがもし質問者が型推論でなく
バリアントのつもりだったらどうする?
0189デフォルトの名無しさん2014/12/27(土) 00:45:16.56ID:klGGX/zS
C++に拘る理由が無いと思う。
0190デフォルトの名無しさん2014/12/27(土) 00:45:21.76ID:iYMAmZHx
もっとも近いのはC#4.0だな
dynamicを使えばいいよ
0191デフォルトの名無しさん2014/12/27(土) 00:48:04.61ID:W6COMWk1
むしろ変数宣言せずに、という意図かも
0192デフォルトの名無しさん2014/12/27(土) 01:06:05.09ID:iYMAmZHx
結局、型を省略するメリットよりもデメリットの方が圧倒的に大きいと思う
つうかメリットが思い浮かばない
0193デフォルトの名無しさん2014/12/27(土) 01:50:07.09ID:cxgsLJOw
型を省略するのには余りデメリットはないんじゃ?
変数の型が途中で変わるのは問題だけど。

javascriptは悲惨
0194デフォルトの名無しさん2014/12/27(土) 03:08:22.79ID:2dHAjI9B
アルゴリズムの教科書でPascal風擬似コードが乗ってたりしますが。
C++風擬似コードでアルゴリズムを書いて動作確認もしたいのですが。
C++でいけない理由は記述量とコンパイル時間が増えるためです。
その点でJavascriptやPHPはまあまあですがC++へ直すのに手間が掛かります。
LLVM技術などでコンバートしたのではコード対応がわけわからなくなります。
clingを使ってみます。
0195デフォルトの名無しさん2014/12/27(土) 03:37:07.98ID:As2Ip7Ib
>C++でいけない理由は記述量とコンパイル時間が増えるためです

こういう馬鹿って何なんだろうと思ったけど
日本人じゃないよな。
インタプリタはもはや関係ねーよ
0196デフォルトの名無しさん2014/12/27(土) 03:39:29.65ID:rEUVsFml
サンプル程度のソース量ならコンパイル時間もたいしたことないよな
型書くのだってそれ省略したら何秒稼げるんだってレベルだわ
0197デフォルトの名無しさん2014/12/27(土) 03:45:24.81ID:YyzzLTt4
C++風疑似コードからC++に直す手間は考えなくていいのか
0198デフォルトの名無しさん2014/12/27(土) 06:22:41.59ID:klGGX/zS
Pascal風疑似コードからC++風疑似コード(なにそれ?)へ直す手間じゃないのか。

あほくさ。真面目に答えて損したわ。
0199デフォルトの名無しさん2014/12/27(土) 08:25:11.07ID:uH9r1QwE
教科書で勉強中ならコンパイル時間が気になるほどの大規模なコードなんて書かないから気にするな
ソースコードとにらめっこする時間のほうがはるかに長い
0200デフォルトの名無しさん2014/12/27(土) 08:27:41.33ID:k+EH4nQM
規模ってのがコード行数とかを意味するんだとしたら、コンパイル時間と規模は直接関係ない。
数十行でもえらく時間がかかることはある。
0201デフォルトの名無しさん2014/12/27(土) 10:05:02.70ID:PS8qPAgg
>>200
> 数十行でもえらく時間がかかることはある。

どんなコードよ
テンプレートとマクロ使いまくりで、30行ぐらいのコードを展開したら 30,000行ぐらいになったのを見たことあるけど、そんな奴じゃね?
0202デフォルトの名無しさん2014/12/27(土) 10:06:23.02ID:0SDe1dTr
お願いです。
馬鹿にこれ以上ふれないでください。
みんなの迷惑になります。
0203デフォルトの名無しさん2014/12/27(土) 10:06:38.53ID:klGGX/zS
そんなやつだったとしたらインタプリタでも時間かかるわ
0204デフォルトの名無しさん2014/12/27(土) 11:18:48.99ID:UR7fgfZM
時間がかかる場合、VSを使ってみると良いよ。

ビルド時間も気になってるだろうけど、一番時間がかかってるのは、デバッガの
アタッチだと思うんだよね。
IDEって大体同じものを使い続けることが多くて、ほかのものを使うことってないから、
話がかみ合わないことあると思う。

VS使ってる人は、他のも一度使ってみると良いよ。
どれだけ恵まれてるかわかるから。
0205デフォルトの名無しさん2014/12/27(土) 12:38:34.83ID:/f2LNY7f
すみません、初心者なんですが
javaでいう
arraylist<自作クラス> al = new arraylist<自作クラス>();
al.add(new 自作クラス(ほにゃらら));

みたいなのを書きたいんですがどうすればいいんですか?
0206デフォルトの名無しさん2014/12/27(土) 13:23:38.90ID:ObSPDQYn
std::vector<自作クラス> v;
v.emplace_back(ほにゃらら);
0207デフォルトの名無しさん2014/12/27(土) 13:34:55.49ID:iYMAmZHx
>>193
> javascriptは悲惨
PythonとかRubyも同じバリアント(動的)型だろ
動的型の話しをしてたんだぞ
0208デフォルトの名無しさん2014/12/27(土) 18:41:42.87ID:k+EH4nQM
>>201
展開したら増えるのはズルじゃないか。
インデックスシーケンスを使いまくってたりすると、結構コンパイル時間が増えるよね?
0209デフォルトの名無しさん2014/12/27(土) 18:56:07.48ID:szXNn9Dx
VSは、まあいい。しかし、officeにDirectXやKinectの仕様変更が酷い。

さすが、マイクロソフト、Windows7 から Windows8、8.1に匹敵する仕様変更。
こんな会社の作ったソフトにいちいち付き合ってられるか!


ビル・ゲイツはここまでひどくはやらなかっただろうな
0210デフォルトの名無しさん2014/12/27(土) 19:07:42.93ID:PS8qPAgg
>>208
> 展開したら増えるのはズルじゃないか。

俺もそう思うが、他の状況が思い付かん
0211デフォルトの名無しさん2014/12/27(土) 19:14:21.04ID:9x3jij6Y
リボンは初心者にとって使いやすいことがわかっている
Excel嫌いだが、XPの頃に比べると2013で大分マシになったと思う
0212デフォルトの名無しさん2014/12/27(土) 20:06:00.17ID:k+EH4nQM
>>210
だからインデックス・シーケンス使いまくったりしたとき、って書いてるじゃないの。
型シーケンスとかと合わせてだよ。
0213デフォルトの名無しさん2014/12/27(土) 20:36:48.64ID:PS8qPAgg
>>212
それって、
> 数十行でもえらく時間がかかることはある。
になるんか?
コード示してみてよ。
0214デフォルトの名無しさん2014/12/27(土) 21:01:06.03ID:k+EH4nQM
(実際の構築方法は違うけど)疑似的に書くと
using types_65536 = type_seq<type0, type1, type2, ・・・, type65535>::type;

こういう時に、下の1行だけで結構時間かかったりするから、
using type32768 = elem_type_at<32768, types_65536>::type;
ちょっと複雑なことするとなかなか帰ってこない
0215デフォルトの名無しさん2014/12/28(日) 00:16:36.02ID:Lg3Cm6Ji
>>214
おう。こんなのはじめて見た。
差し障りなければどんなとき使うのか教えて。
0216デフォルトの名無しさん2014/12/28(日) 00:36:34.31ID:nc3me1Mq
コンパイル時計算使えばコンパイル時間長くする方法なんていくらでもあるやん。
0217デフォルトの名無しさん2014/12/28(日) 01:16:46.27ID:lSEOZgzZ
コンパイル時間が増えてる理由として、マクロ展開したら見た目よりずっとコードが増えてる、ってのはズルだ。
だけど可変長テンプレートで 0...9999999 に展開してもそれは1行だから。
0218デフォルトの名無しさん2014/12/28(日) 01:18:56.53ID:j9UEZndf
>>200が、ここらでちゃんと名乗り出て、
「数十行でもえらく時間がかかることはある」の例を示せばいいと思う。
0219デフォルトの名無しさん2014/12/28(日) 01:34:37.37ID:lSEOZgzZ
>>218
>>200=>>214 みたいですよ
0220デフォルトの名無しさん2014/12/28(日) 10:14:35.85ID:eHJNmj1f
コンパイルに死ぬほど時間がかかると思ったら、avg切ったらサクサクになった。
で、avastに変えたら、cygwin gccで作るものをことごとく撥ねる。
もうやだ。
0221デフォルトの名無しさん2014/12/28(日) 11:30:00.76ID:Jo+HFORJ
教科書の擬似Pascalで書かれたコードをC++で書きたいけど
C++は記述量が多くてコンパイルは時間がかかるという認識レベルの人に対する話なのだから
constexprや可変長テンプレートを駆使すれば短いコードでも遅くなるという
その通りではあるけれど極論を持ち出されてもなあ
0222デフォルトの名無しさん2014/12/28(日) 12:08:04.57ID:Kx1DljV8
回答に関する不満の相談もアリなのか…
0223デフォルトの名無しさん2014/12/28(日) 12:30:20.50ID:lSEOZgzZ
特定の言語の技術なんて初心者が数か月でトップレベルに追いつくんだから極論というほどでもないでしょ
0224デフォルトの名無しさん2014/12/28(日) 12:56:37.15ID:xYJMSdQX
このスレだったか、Visual C++でstatic_castの結果が
左辺値になるバグを嘆いていた人がいたけど、
警告レベルを上げると警告が出るな。
warning C4213: nonstandard extension used: cast on l-value
拡張を無効にすると標準ヘッダーさえコンパイルできない糞コンパイラ
0225デフォルトの名無しさん2014/12/28(日) 14:52:18.53ID:lSEOZgzZ
>>224
ああそれな。
右辺値を取りたいだけなのにstatic_castがダメ。
moveじゃ文字通りmoveされちゃうし。

template <typename T> T&& identity(T&& x) { return std::forward<T>(x); }
template <typename T> T identity(T& x) { return x; }
template <typename T> T identity(const T& x) { return x; }
ちょっと冗長だけどこれが一番効率的なのかなあ。なにか標準にあるような気もするけど。
0226デフォルトの名無しさん2014/12/28(日) 17:25:47.33ID:vG0thnjX
>>225
>moveじゃ文字通りmoveされちゃう

ちょっと何言ってるかわからんのだが。
std::move(a)
としただけではムーブされるはずもなく
0227デフォルトの名無しさん2014/12/28(日) 17:36:17.88ID:QvuCm+ly
const Image& getImage() {
return m_image;
}

あるクラスのpublicにある関数なんですが
constと&の意味を教えて下さい
0228片山博文MZ ◆T6xkBnTXz7B0 2014/12/28(日) 17:53:50.39ID:uYOofsQ/
>>227
変更できない参照。
「C++ 参照」で検索。
0229デフォルトの名無しさん2014/12/28(日) 17:56:43.43ID:QvuCm+ly
>>228
無駄なリソースを使わずに値だけを読ませるということでいいのでしょうか
0230デフォルトの名無しさん2014/12/28(日) 18:47:03.10ID:6Z3FAnif
折れも分からん,(それが参照にしろポインタにしろ)返り値に const をつけるってどういう意味だろう‥もらった後に一切変えないつもり!受け取る変数のタチを絞る!っていう布石なのかな‥
関数入力側引数に const + & はほぼ必須の手法だが‥
0231デフォルトの名無しさん2014/12/28(日) 18:54:16.52ID:AQDitcxr
>>230
参照先は変更しないってことでしょ
関数の引数と同じだよ?
0232デフォルトの名無しさん2014/12/28(日) 19:06:18.49ID:UAyuklQe
>>226
moveしたものをどっかに渡したら、受け取った方は資源を奪い取る可能性があるだろ。
だから左辺値を勝手にmoveするわけにはいかず、コピーを取る必要がある。
もともとが右辺値だったらそのままforwardすればいい。

その場合分けを自動的にやってくれるものが欲しいわけで。
0233デフォルトの名無しさん2014/12/28(日) 19:09:23.91ID:B20be7Yf
>>230
「勝手に変えんなハゲ」以外に答えが有るのか?
0234デフォルトの名無しさん2014/12/28(日) 19:19:13.65ID:8FJd85Wr
誤代入を防ぐって効率的C++にあったな
0235デフォルトの名無しさん2014/12/28(日) 20:01:48.35ID:wodjdDCA
まあ、どうでもいい話だわ
0236デフォルトの名無しさん2014/12/28(日) 20:51:24.35ID:UeK7l5/E
>>227
「コピーじゃなくて保持している内部のオブジェクトに触らせてやる」
「マルチスレッドでのアクセス上等」
0237デフォルトの名無しさん2014/12/28(日) 21:02:41.16ID:ud9CsIxk
>>236
マルチスレッドだと参照の方がまずいだろ。
生成してから書き換えないならいいけど。
0238デフォルトの名無しさん2014/12/28(日) 22:35:58.57ID:04pkC8+h
リードオンリーだから
0239デフォルトの名無しさん2014/12/28(日) 23:30:08.99ID:fTdAgh8I
>>227
そういう場合はメソッドそのものもconstにするけどよく使う
const取り除いた同名メソッド二つ用意することもあるけどそれはクラスオブジェクトがconstでもconstじゃなくても同名で呼び出せるようにするため
string::begin()もそんな感じ
厳密にはconstじゃないけど、const stringのときはconst_iterator、constついてないstringオブジェクトの時はiterator返す
0240デフォルトの名無しさん2014/12/29(月) 03:29:57.82ID:Zvu39mrs
>>206
ありがとうございます!
できました!

もう一つ聞きたいのですが

FloatBuffer フロバ;
arraylist <float> リスト= new arraylist<float>();

リスト.add(ほにゃらら);
…

ByteBuffer ばば = ByteBuffer.allocateDirect(リスト.size() * 4);
ばば.order(ByteOrder.nativeOrder());
フロバ = ばば.asFloatBuffer();
for ( i = 0; i < リスト.size(); i++){
フロバ.put(リスト.get(i));
}
フロバ.position(0);

こんなようなことって出来ますか?
0241デフォルトの名無しさん2014/12/29(月) 07:57:13.86ID:R9uwHG6j
>>239
> そういう場合はメソッドそのものもconstにするけどよく使う

メソッドの const は意味が違う
const にするケースが多いのは確かだけど
0242デフォルトの名無しさん2014/12/29(月) 08:14:31.75ID:RCKTbDKZ
>>240
std::vector内部の要素は連続した領域に確保されるから、
float* フロバ = リスト.data(); // または &リスト[0]
でいいんじゃないの?
もしくは リスト[i] とそのままアクセスしても効率は変わらんよ。
0243デフォルトの名無しさん2014/12/29(月) 08:35:43.34ID:NcjyMXWK
const/非constメソッド両方つくるのめんどくさいんだがどうにかならんのかアレ
片方だけつくってconst_castはなんか違う気がするし
0244デフォルトの名無しさん2014/12/29(月) 08:43:07.84ID:RbfS6PMd
#define _CONST(DECL,DEF) \
DECL DEF\
const DECL const DEF

_CONST(void func(),{return ;})
うーん・・・
0245デフォルトの名無しさん2014/12/29(月) 09:55:34.36ID:KuYXSH39
>>243
名前も引数も同じでconst有無の違うのを2つ作るの?
紛らわしいからやめとけ
0246デフォルトの名無しさん2014/12/29(月) 09:58:33.01ID:BlWo3aSQ
自分はconst付きしか作らないけどconstなし作るといいことあるのか?
0247デフォルトの名無しさん2014/12/29(月) 10:00:37.25ID:KuYXSH39
>>246
データメンバーに変更を加えるメソッドはconstにできないけど
0248デフォルトの名無しさん2014/12/29(月) 10:03:06.90ID:BlWo3aSQ
当たり前だけど変更を指示するメソッドにはconstつけないよ
それ以外のメソッドにconstなしを作るかって話でしょ?
0249デフォルトの名無しさん2014/12/29(月) 10:05:54.36ID:NcjyMXWK
>>245-256
std::vectorとか典型的だけど
データメンバの参照を返さなきゃいけないメソッドなんかには結構必要になる
0250デフォルトの名無しさん2014/12/29(月) 10:07:46.72ID:KuYXSH39
>>248
ああそれならconstは無条件に付ける
0251デフォルトの名無しさん2014/12/29(月) 10:14:49.29ID:Dgi09YwQ
>>249
mutableでよくね?
0252デフォルトの名無しさん2014/12/29(月) 11:26:39.60ID:z79n6Uol
>>251
何言ってんだ…?
0253デフォルトの名無しさん2014/12/29(月) 11:37:50.70ID:+aIcAFWQ
>>250
>>251
理解出来てないのに知ったかぶるのやめた方がいいよ
0254デフォルトの名無しさん2014/12/29(月) 17:24:11.38ID:KuYXSH39
mutableはうまく使えばconstメソッドを維持できるだろ、使いすぎるとconstの意味がなくなるが
0255デフォルトの名無しさん2014/12/29(月) 18:06:12.34ID:f7raGOFd
コンパイルが通れば意味などどうでも良い
というのが254の考えなのであった
0256デフォルトの名無しさん2014/12/29(月) 18:32:58.43ID:z79n6Uol
mutableはたとえば
vector<char> rawdata()const
{
unique_lock lk(mutex_);
return data_;
}
のmutex_に付けるとか意味的にconstであることを維持出来る場合に使うもの。
>>243
が言ってるのはvectorのoperator[]とかat、beginみたいな物の話で全く違う。
0257デフォルトの名無しさん2014/12/29(月) 20:49:36.52ID:4DL1BiPX
>>230
コンパイラがコード生成する際に、値をコピーしないという判断が可能になる。
0258デフォルトの名無しさん2014/12/29(月) 20:57:03.77ID:z79n6Uol
>>257
可能になるって書いたらそうしなくても良いみたいに読み取れるだろ。
0259デフォルトの名無しさん2014/12/29(月) 22:42:34.36ID:eLFvzmg+
mutableとかconst_castとか使わなくて済むように、基底のところではちゃんとconstを付けろ。
具体的には、ODBCのAPIとか、引数がconst SQLCHAR*じゃなくてSQLCHAR*になっているせいで
ユーザーコードの側でmutableとかconst_castを使うはめになってるだろ?
そういうのやめてほしいんだよ。

(詳細忘れたので名前間違ってるかも試練)
0260デフォルトの名無しさん2014/12/29(月) 23:34:37.63ID:sxuLeXgN
>>259
>ユーザーコードの側でmutableとかconst_castを使うはめになってるだろ

ライブラリが糞なためにconst_castが必要になることはあるが
mutableを使うのは何かおかしくね?
mutableなんて自分がクラスを定義する時に
ミューテックスかキャッシュに使う奴だろ
0261デフォルトの名無しさん2014/12/29(月) 23:43:22.44ID:NcjyMXWK
>>260
ライブラリが糞なときはどっちかというと一時バッファにコピーして渡すほうを選ぶわ
例外出しちゃダメとかだとこれはこれで面倒だけど
糞ゆえに実際ほんとに書き換えてるかもしれんもの。
0262デフォルトの名無しさん2014/12/29(月) 23:51:02.54ID:NJRVwBPj
C/C++はmain関数からして糞だから細かいこと気にしてると禿げるぞ。
mainはいい加減に
int main(int argc, char const *const *argv)
を許すべき
0263デフォルトの名無しさん2014/12/30(火) 00:11:34.57ID:/MaaffoK
>>261
俺もそうしてる。
0264デフォルトの名無しさん2014/12/30(火) 00:15:55.66ID:jrN3+PoU
>>260-263
あんたらの言う通りだ。
オレが言いたかったことはわかってくれ。
0265デフォルトの名無しさん2014/12/30(火) 00:16:13.97ID:39ECbyHQ
>>258
どんなコードを生成するかは、他にも条件がある。
0266デフォルトの名無しさん2014/12/30(火) 01:44:21.10ID:1zc8xpv9
>>262
普段からint main(int argc, const char argv[])って書いてるけど問題あるの?
0267デフォルトの名無しさん2014/12/30(火) 03:57:45.78ID:SbfdzLBU
>>266
それだと値はread-onlyだけどポインタは変更可能になっちゃう
俺はそれを「頭隠して尻かくさず」と今から呼ぶ
0268デフォルトの名無しさん2014/12/30(火) 04:21:16.22ID:iV8mgJ7+
>>266
1 規格上保証されていない
2 互換性の無い型を使うな
 const char **v = (char **)argv; //エラー
 const char *const *v = (char **)argv; // OK
0269 ◆QZaw55cn4c 2014/12/30(火) 04:23:36.15ID:i+30FOkq
でも argv を書き換えてどうこうする、というコードはあたりまえにあるからな‥
0270デフォルトの名無しさん2014/12/30(火) 04:31:43.65ID:iV8mgJ7+
1 型を変えるんじゃなくてconst版も許可したいという話だろ?
2 argvを書き換える糞ソースはあるが
 *argvや**argvを書き換える糞ソースはそんなにはないだろう
0271デフォルトの名無しさん2014/12/30(火) 04:32:54.78ID:PFdyrfgS
与えられたコマンドライン引数をある規則に従ってすり替える、って話だな
0272デフォルトの名無しさん2014/12/30(火) 04:37:41.94ID:iV8mgJ7+
>>271
そんなのは
int main(int argv, char *argv[]) {
 魔改造(&argc, &argv);//この膣内でnew
}
でいいんじゃないの
0273デフォルトの名無しさん2014/12/30(火) 06:56:59.46ID:f6h/n6k9
strtokで空白->null文字に置き換えて処理するのはよく見
長さ変えず処理すればおk
0274デフォルトの名無しさん2014/12/31(水) 00:24:27.07ID:oy55ZnpW
UTF-16/8の併走が確実になった時点でLua規模のインタプリタを規格に取り込んで文字操作と入出力を任せてしまえばよかったんだけどな
0275デフォルトの名無しさん2014/12/31(水) 01:23:52.12ID:n+VO5zpK
>>274
C++で文字操作に困ってないんだけど、Lua入れたら何が嬉しいの?
0276デフォルトの名無しさん2014/12/31(水) 02:34:12.62ID:6T3zfuUi
コピー禁止のクラスを作る場合、C++11時代でもboost::noncopyableを使うのが一番手っ取り早いの?
0277デフォルトの名無しさん2014/12/31(水) 02:36:25.59ID:Imw1KDaA
=deleteでいいだろ
0278デフォルトの名無しさん2014/12/31(水) 02:48:58.93ID:n+VO5zpK
03時代も2〜3行ほど追加するだけなのにわざわざboost使うまでもないよね。
0279デフォルトの名無しさん2014/12/31(水) 06:55:38.56ID:cgqKf6SH
>>276
暗黙生成のルールは複雑だから4つ書いとけ
struct unko {
 unko(unko const &)=delete;
 unko(unko &&)=delete;
 void operator=(unko const &)=delete;
 void operator=(unko &&)=delete;
}
まさにボイラープレートとはこのことだ
0280デフォルトの名無しさん2014/12/31(水) 23:32:45.41ID:7bpGH/R+
-=・=- -=・=- ;
0281デフォルトの名無しさん2015/01/01(木) 21:34:36.43ID:n3V4qFhd
A、B、C、Dの4つのクラスがあって
これらのインスタンスの合計が200以下になるように管理したいのですが
200×4を初めに確保してexistFlagなどで管理するべきか
200を越えないようにnew deleteするべきか
どちらが良いでしょうか
0282デフォルトの名無しさん2015/01/01(木) 21:47:31.22ID:JXjPsVlJ
>>281
後者ができるなら前者にするメリットがわからないのだが
0283デフォルトの名無しさん2015/01/01(木) 21:58:47.29ID:aUgqaYf8
四つのクラスのスーパークラスを作ってスーパークラスのリストで管理
0284デフォルトの名無しさん2015/01/01(木) 22:04:39.02ID:c7lZY8p6
4つのクラスを整理して総合した1つのクラスを作る
0285デフォルトの名無しさん2015/01/01(木) 22:09:10.05ID:TPRv8yF2
毎回確保してたりしたら重くなるとかそういうのきいてんじゃね
0286デフォルトの名無しさん2015/01/01(木) 22:14:47.34ID:A86JtUaP
そんなのそこがボトルネックになってから考えるべき。
早すぎる最適化はダメって昔から言われてるだろ
0287デフォルトの名無しさん2015/01/01(木) 22:15:33.05ID:UD8gY9kq
union { A; B; C; D} の配列 [200]
0288デフォルトの名無しさん2015/01/01(木) 22:16:04.26ID:fLF7bH9Q
もし生成消滅を1秒間に10万回ぐらい行うプログラムなら
ABCDのunionのメモリを200個静的に確保して
カスタムアロケーターで管理だな。
だが素人にはオススメできない。
0289デフォルトの名無しさん2015/01/01(木) 23:28:17.98ID:5bVQoG0Q
placement new
0290デフォルトの名無しさん2015/01/01(木) 23:57:28.12ID:flJTiBeb
メモリの確保でc++はnewって初心者向けのサイトにあるけど、
実際業務で扱う場合はnewではなくてスマートポインタが当たり前だったりする?
0291デフォルトの名無しさん2015/01/02(金) 01:01:42.01ID:jkIjgD0V
そもそもvectorとか使えたらそっちの方が断然楽だろ
0292デフォルトの名無しさん2015/01/02(金) 01:43:11.89ID:7+k4tJMb
>>282-291
ありがとうございます
vector+スーパークラスのスマートポインタでインスタンスを管理することに決めました

もう一つ質問なのですが
Controlerクラスが、A,B,C,D4つの派生元であるスーパークラスSのスマートポインタのvectorを持っているとして
Controlerがあるインスタンスを実行中にそのインスタンスからBのインスタンスを作りたいとなったとき
インスタンスを作成できるのはポインタを持っているControlerなので、Controlerに確保する関数を作って
Controlerの参照をインスタンスに渡して確保する関数を実行するということになるのでしょうか?
これだと呼び出し先が呼び出し元を呼び出して何か違う気がしました
0293デフォルトの名無しさん2015/01/02(金) 08:18:56.48ID:2SopZcG5
>>292
インスタンスの所属に関する良くある問題だと思う。
あなたの用途には当てはまらないかもしれないが、複数のControllerが存在し得て、
それぞれが200個までのA,B,C,Dを持てる場合には、どういう設計になるだろうか?

Controllerがシングルトンなのであれば、それを取得するグローバル変数 or 関数を
用意すれば、Controllerを引き回さなくて済むだろう。
0294デフォルトの名無しさん2015/01/02(金) 10:19:55.57ID:6s3QU+2U
>>292
Controllerクラス(l一個多い?)が確保してるインスタンスをループで逐次実行するような作りなのかな?
引数で渡すか、インスタンスに変数で持たせるか、シングルトンやグローバル変数でアクセスするかってところだな
0295デフォルトの名無しさん2015/01/02(金) 12:35:01.81ID:F7Nf/+TC
>>290
newかスマートポインタか、という比較は意味不明だな
newはメモリの獲得方法、スマートポインタはその開放忘れを防ぐ仕組みを持つ型の事だろ
0296デフォルトの名無しさん2015/01/02(金) 12:52:35.55ID:5Yq30nMG
make_shared とか
0297デフォルトの名無しさん2015/01/02(金) 13:15:09.87ID:7+k4tJMb
>>293-294
Controllerは実質シングルトンなのでアクセスさせる関数をグローバルに用意することにしました
ありがとうございます
0298デフォルトの名無しさん2015/01/02(金) 13:24:49.90ID:4efdvCq8
vector<int> v = {1,2,3};
for_each(v.begin(),v.end(),[](int& n){ n *= 3; });
for_each(v.begin(),v.end(),[](int n){ cout << n << endl; });


このfor_eachの[](int& n)や[](int n)の部分がよくわからないです。
なんで( )の前に[ ]がつくのか、参照で値を渡してるのか渡してない時もあるのか。
たまに[&]な時もあったり、とにかくfor_eachがよく分からないので教えて下さい・・・
0299デフォルトの名無しさん2015/01/02(金) 13:34:12.89ID:zzU87XUx
ラムダ式
0300デフォルトの名無しさん2015/01/02(金) 13:46:21.12ID:7JlS4zBv
TCHAR InfFile[MAX_PATH];
get_inf_file(InfFile); // ←ここでInfFileにファイル名が入る。

_tprintf(_T("%s\n"), InfFile); // 文字化けする。
printf("%s\n", InfFile); // 文字化けしない。


誰かが作ったget_inf_file(TCHAR * InfFile)という関数があり、実行すると
_tprintfで表示すると文字化けして、printfだと文字化けしないのですが
意味がわかりません。TCHARなのだから_tprintfを使うのではないのでしょうか

実際にこの関数を使わないで文字リテラルを指定すると文字化けしません。
0301デフォルトの名無しさん2015/01/02(金) 13:50:58.27ID:A83rtBgH
>>300
Visual C++と理解したけど
#include <clocale>
#include <tchar.h>
_tsetlocale(LC_CTYPE, _T(""));
しても文字化けする?
0302デフォルトの名無しさん2015/01/02(金) 13:56:47.60ID:7JlS4zBv
>>301
文字化けします。

_tsetlocale(LC_ALL, _T("Japanese_Japan.932"));を指定してたのを_tsetlocale(LC_CTYPE, _T("")); にしました
0303デフォルトの名無しさん2015/01/02(金) 14:01:08.04ID:7UbCEqjn
TCHARと_tprintfが一致してることは確認済み?
0304デフォルトの名無しさん2015/01/02(金) 14:06:48.36ID:A83rtBgH
>>302
ならget_inf_fileがおかしいんだろう。
UnicodeビルドでUTF-16が入るべき所に
シフトジスが入ってるとみた。
printf("%04X", InfFile[0]&0xffff)
が二桁になってるだろ?
0305デフォルトの名無しさん2015/01/02(金) 14:12:02.67ID:F7Nf/+TC
だな、誰かが作ったというget_inf_fileの充填結果が、こちらの期待する文字列エンコードと合致してないんだよ
0306デフォルトの名無しさん2015/01/02(金) 14:33:20.81ID:7JlS4zBv
>>304-305
まじっすか、そんなこともあるんですね
作ったのが外人なので、なかなか直してももらえないと思うのですが

変換とかできるのでしょうか、VSだとコンパイル時にシンタックスエラーになるのですが
0307デフォルトの名無しさん2015/01/02(金) 14:45:56.25ID:F7Nf/+TC
>>306
まず、自分のプロジェクトはunicodeなのかansiなのか
関数が充填したパス文字列は、バイト配列としての中身がunicode文字列なのかansi文字列なのか
0308デフォルトの名無しさん2015/01/02(金) 14:48:01.53ID:9E+XPI9z
>>300
要するに、
get_inf_file(char * InfFile)
実際にはこういう定義で、マルチバイト固定で作られてるので
自アプリがUnicodeビルドならUnicodeに文字コード変換する処理を
かましてやればいい
0309デフォルトの名無しさん2015/01/02(金) 14:54:46.06ID:7JlS4zBv
>>307-308
なるほど
英語圏の人はそこらへんいいかげんなのかもしれませんね

やってみます
0310デフォルトの名無しさん2015/01/02(金) 16:51:47.96ID:F7Nf/+TC
アメリカ人は特に国際的意識が低いから、unicodeなんてどうでもいい存在だと思ってる
世界中の物の単位がインチやマイル、ポンド、華氏、だと思ってるしそれを外国人に押し付けてくる
0311デフォルトの名無しさん2015/01/02(金) 17:11:39.19ID:2SopZcG5
でも日本人はlocaleやタイムゾーンに無関心なんだよな。
桁区切りはカンマ、小数点はピリオドだと思い込んでるし、tm_isdstの確認もしない。
0312デフォルトの名無しさん2015/01/02(金) 17:53:40.11ID:SdwiTPDP
小数点にカンマを使う文化圏の人達にとってはソースコードが違和感だらけなんだろうなぁ
いずれ慣れるんだろうけど
0313デフォルトの名無しさん2015/01/02(金) 18:10:23.94ID:F7Nf/+TC
>>312
ソース書く人は開発者の端くれだから、C/C++ソースが米国文化をデフォルトとするのはそう言うものだとおもってたんじゃないかな
数値や年月日書式はOSやライブラリでも面倒見てくれたし
0314デフォルトの名無しさん2015/01/02(金) 18:21:32.55ID:lBKtUQs0
カンマは4桁ごとにして欲しい
0315デフォルトの名無しさん2015/01/02(金) 18:31:24.40ID:U8M1VAWr
>314

本多勝一さんが、ずっと前からそう主張されて
いますね。わたしも同感です。
日本語の記数法からいって、4桁が合うと思います
0316デフォルトの名無しさん2015/01/02(金) 20:04:31.50ID:mlj15zVW
>>315
日本語ではね
英語圏ではサウザンド、ミリオン、ビリオンの世界だから3桁がいいんだろうけど
0317デフォルトの名無しさん2015/01/02(金) 20:15:50.21ID:buPBY5a2
>>315
日本では確かに4桁の方がわかりやすいけど、
混同しないように別の記号にした方がよさそうだね。
0318デフォルトの名無しさん2015/01/03(土) 00:43:47.56ID:/WOuYfDa
大体、英米の鬼畜野郎どもは、「グローバルスタンダード」といってる癖に
SI単位使わないじゃあねえか。

いつまで、インチ、フット、ポンド使うつもりなんだ! liars!
0319デフォルトの名無しさん2015/01/03(土) 00:48:50.05ID:4e+tzVBF
敗戦国=奴隷ッスカラネ
シャネッス
0320デフォルトの名無しさん2015/01/03(土) 00:56:34.82ID:Z3HMQ9o8
>>319
日本に対してだけではない
アメリカ人は世界中がアメリカと同じ文化で生活してると思ってる
0321デフォルトの名無しさん2015/01/03(土) 01:15:07.40ID:kbrpwiZV
インドでは最初だけ四桁、後はずっと二桁区切り
0322デフォルトの名無しさん2015/01/03(土) 02:15:38.61ID:2MH2vTPI
アメリカはまだマシな方
イギリス人の頭の古さには脱帽する
イギリス=後進国
0323デフォルトの名無しさん2015/01/03(土) 02:18:41.65ID:AuGuhWCh
イギリスは世界を征服してた事があるから、そりゃ過去が忘れられんだろうね
0324デフォルトの名無しさん2015/01/03(土) 02:23:04.51ID:AuGuhWCh
日本語はコンピューターには向かない言語だと言わざるを得ない
逆に英語はコンピューターに向いてる
0325デフォルトの名無しさん2015/01/03(土) 02:57:12.14ID:kbrpwiZV
日本語は逆ポーランド記法によりコンピューターに向く言語だと言わざるを得ない。
と思っていた時期もあったような
0326デフォルトの名無しさん2015/01/03(土) 03:03:05.64ID:pcdNaXmh
>>324
http://www.entis.jp/doc/japanese/
0327デフォルトの名無しさん2015/01/03(土) 03:26:48.71ID:AuGuhWCh
>>326
つうか文法を全く説明してないしw
まじめにやったら結構大変な分野だろうけど
0328デフォルトの名無しさん2015/01/03(土) 04:37:47.93ID:UGnRQrnS
std::vectorの要素を番号を指定してeraseすることって出来ませんか?
0329デフォルトの名無しさん2015/01/03(土) 04:40:19.30ID:Cj8CgFQv
begin() + indexで消せる
0330デフォルトの名無しさん2015/01/03(土) 04:41:53.98ID:UGnRQrnS
ありがとうございます
そんな簡単だったんですね
0331デフォルトの名無しさん2015/01/03(土) 23:18:32.07ID:Mi3y7m+B
>>318
でも、SI単位系だと3桁区切りなんだよなぁ
0332デフォルトの名無しさん2015/01/04(日) 00:28:41.62ID:WmAHCknd
const char hoge[] = "abcdefghijk";
const char* const first0 = &hoge[ 0 ];
const char* const last0 = &hoge[ 3 ];
const char* const first1 = &hoge[ 5 ];
const char* const last1 = &hoge[ 9 ];
strcmp???( first0, last0, first1, last1 );

こんな感じで二組の文字列の範囲から辞書順比較する方法おしえてください
0333 ◆QZaw55cn4c 2015/01/04(日) 00:50:49.32ID:kU4tFNpU
>>315
本多勝一氏か‥
懐かしい名前だね‥
氏の「日本語の作文文法」の特に読点に関する考察はなかなか示唆に富むものだったが‥
しかし、あの体臭はどうにかならんかねえ‥ポルポトを擁護したという過去は忘れてあげるからさあ‥
0334デフォルトの名無しさん2015/01/04(日) 01:14:59.66ID:JaJcpRWI
>>332
自分でコードを書く
以上
0335デフォルトの名無しさん2015/01/04(日) 01:16:25.64ID:WmAHCknd
>>334
そういうのは別にいらないので消えてください
0336デフォルトの名無しさん2015/01/04(日) 01:25:27.23ID:cj3MqVPN
> 本多勝一氏か‥
写真捏造の人だよね
0337デフォルトの名無しさん2015/01/04(日) 01:30:12.10ID:0uOcaWII
>>332
質問の意味がよくわからん
0338デフォルトの名無しさん2015/01/04(日) 08:35:31.27ID:99+RPTin
コピーせずに処理したい→string_view自作しろ
比較アルゴリズムをしたい→スレ違いだ
ライブラリありませんか→ねーよ
0339 ◆QZaw55cn4c 2015/01/04(日) 13:01:12.49ID:kU4tFNpU
>>336
それは違うね‥
0340デフォルトの名無しさん2015/01/04(日) 13:09:46.78ID:+b+eo/V4
フランスではカンマとピリオドの使い方逆なんだよな
それも規格でどっちでもいいことになってて結構あいまいさ残ってる
あとlong scale、short scaleアジア圏でも万進、万万進、ベトナム式下数とか数の問題は複雑
0341デフォルトの名無しさん2015/01/04(日) 13:11:09.63ID:XPPzqmKU
>規格でどっちでもいいことになってて

ソースは?
0342デフォルトの名無しさん2015/01/04(日) 13:16:11.02ID:+b+eo/V4
>>341
聞く前にググればすぐ出てくる
とりあえず
http://www.s-yamaga.jp/opinions/doryoko.htm
>日本は英米流で小数点には<.>派で、<,>は位取りに使っているが、仏独など多くの国では小数点は<,>で、<.>は位取り(位取りのため空白を使う場合もある)である。
>2003年10月にパリで開かれた国際度量衡会議でこの問題が検討された。
>17日の1国1票の投票の結果、「小数点は<,>か<.>のどちらかである」とすることで(つまりどちらでもよいということで)、当面の決着がついた。
0343デフォルトの名無しさん2015/01/04(日) 13:20:42.93ID:+b+eo/V4
当時読んだ活字の記憶では
・位取りはなるべく空白を使うこと(カンマでもピリオドでもない)
 ただし強制ではない
・小数点は、カンマでもピリオドでもよい
というものだった
0344デフォルトの名無しさん2015/01/04(日) 13:29:23.35ID:TMi+DxjA
テキスト形式で数値を羅列する場合は、該当地域の文化に設定されているMS ExcelがCSVとして正しく読み込める事、を条件としてるよ

VB6やC#/VBのFormat関数はデフォで小数点記号考慮してくれるけど、C++ではOS設定を見て自前処理だ
0345デフォルトの名無しさん2015/01/04(日) 13:31:24.47ID:pqc5lw4y
どちらの表記法を使っているか分からないと
123,45 なら、何とか分かるけど
123.456 は小数なのか位取りなのか判断できないことになるね?
0346デフォルトの名無しさん2015/01/04(日) 13:39:40.70ID:TMi+DxjA
ただFormat関数は、文化ニュートラル(実質アメリカン書式)を強制したいXML生成とか機器制御コマンドなんかではかえって迷惑だったりする

ThreadCultureをニュートラルにいちいち設定しないといけないし、あ、VB/C#の話ね
0347デフォルトの名無しさん2015/01/04(日) 13:41:50.88ID:HIHn1oXx
>>346はどうしようもない馬鹿
C#でXMLを生成すんのに自前で変換すんなタコ
0348デフォルトの名無しさん2015/01/04(日) 14:41:25.06ID:LHqo9g84
>>332
戻り値が bool で良ければ lexicographical_compare
0349デフォルトの名無しさん2015/01/04(日) 14:49:44.93ID:cj3MqVPN
>>339
いやあってるよ
朝日らしく捏造ではなく誤用だという形で
本人も認めてるよ
0350デフォルトの名無しさん2015/01/04(日) 15:16:45.02ID:WmAHCknd
>>348
これで出来ました

>>334>>337>>338
お前らは本当に無能ですね
0351デフォルトの名無しさん2015/01/04(日) 15:25:04.85ID:FkvmMkr7
>>348
へー こんなのあるんだ。
今までは長さの min() とって memcmp() してた。
0352デフォルトの名無しさん2015/01/04(日) 15:32:55.25ID:UrD0d14K
人を馬鹿だとか無能だとかいえるような
優秀な人がたくさん集まったスレッドなんですね
0353デフォルトの名無しさん2015/01/04(日) 15:40:14.36ID:B3IvvgpA
この手の技術系スレは、自分は何もかも知り尽くした天才で周りは全て馬鹿、という態度で書いてる奴が時々居るのよ
0354デフォルトの名無しさん2015/01/04(日) 15:51:23.91ID:VyogYpyR
皆わかっているとは思うけど
>>348と>>351はQの自演だぞ
0355デフォルトの名無しさん2015/01/04(日) 18:54:03.72ID:ZWEZbTe4
2つの集合a,bがあったときにその和集合,差集合をつくってaにいれたいです
a = a - b;
a = a + b;
みたいな感じにしたいのですが
今だと,下みたいにやってます
もっと簡潔にかけませんか?

set<int> a = { 1, 2, 3, 4 };
set<int> b = { 3, 4, 5, 6 };
set<int> c;

set_difference(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.end()));
a.clear();
copy(c.begin(), c.end(), inserter(a, a.end()));
for (int i : a) {
cout << i << " ";
}
cout << endl;
0356デフォルトの名無しさん2015/01/04(日) 19:10:46.28ID:FLoKSBkb
>>355
boost::range版ならset_difference(a, b, inserter(c, c.end()));と書ける。
あとはa.swap(c);としたほうが簡単速い。 これ以上短くしたいなら関数にまとめる。
0357デフォルトの名無しさん2015/01/04(日) 19:16:50.27ID:L6fkGxZk
集合クラス作って演算子オーバーロードしとくかなあ
ググりゃ転がってそう
0358デフォルトの名無しさん2015/01/04(日) 19:37:56.46ID:VX3mvVTy
>>355
試してないけど、↓これじゃダメなの?
for(int i; b) { a.erase(i); } // a = a - b
a.insert(b.begin(), b.end()); // a = a + b
0359デフォルトの名無しさん2015/01/04(日) 20:06:04.40ID:LHqo9g84
まんま std::set_difference と std::set_union なのでは…
これより簡潔にしたいなら自分でラッパーなり書くしかないと思うお…
0360デフォルトの名無しさん2015/01/04(日) 20:30:47.31ID:LHqo9g84
ヒマだったから書いてみたお
コンテナを受け取るラッパー関数書くだけで意外とすっきりしたお
https://ideone.com/YikJPu
03613552015/01/04(日) 20:58:50.58ID:ZWEZbTe4
みなさんありがとうございます
競プロで書いているときにbeginとかendを書くのが大変だったので
なにか楽な方法を探してました
a.swap(c)とかa.insert(b.begin(), b.end())は全然思いつかなかったので参考になりました.使わせてもらいます
とりあえず他のintersectionとかはラッパ書いて処理してみます

ありがとうございました
0362デフォルトの名無しさん2015/01/04(日) 22:30:48.07ID:kU4tFNpU
>>349
なるほど、確認した。半年前の話か‥
0363デフォルトの名無しさん2015/01/05(月) 22:33:25.30ID:f33/Q9TD
前スレにあったプライベート変数にアスセスするコードをようやく理解した。
ほぼコピペだが記念に貼っとく
http://ideone.com/GVpGlQ
0364デフォルトの名無しさん2015/01/06(火) 01:36:28.96ID:vDyOmCN+
何でそんな事したいのか分からないけど、初期化時にポインタ受け取れば済むような
0365デフォルトの名無しさん2015/01/06(火) 14:33:17.28ID:SaW7LnEX
C++のstd::listってガベージコレクションはしていないんですよね?
フラグメンテーション起こさないようにするためにはどっか別に固定領域を確保してそっからデータ持ってくるようにしないと
ダメでしょうか?
0366デフォルトの名無しさん2015/01/06(火) 14:40:08.17ID:C2mmH5Le
はい
0367デフォルトの名無しさん2015/01/06(火) 18:04:47.26ID:22vat4md
いえ、してますよ
マークアンドスイープ方式のガベージコレクションをしてないだけで
0368デフォルトの名無しさん2015/01/06(火) 18:34:47.65ID:0kbQZJFE
フラグメンテーションとGC直接関係ないし
0369デフォルトの名無しさん2015/01/06(火) 19:11:45.23ID:XxVOSZ3z
コンパクション(メモリのデフラグ)も行うコピーGCのことを言っているんじゃないかと
しかし、時代はGCじゃないよねぇ。時代は参照カウントだよ。
C++11でも、shared_ptrが追加されたし。
シンタックスがどんどん汚くなっていくのはC++の悲しいところだな。
0370デフォルトの名無しさん2015/01/06(火) 19:24:03.99ID:Ey7XFEeM
>時代は参照カウントだよ

へー、そいつは凄いな
0371デフォルトの名無しさん2015/01/06(火) 22:59:26.61ID:Y26C2d1q
そういや、shared_ptr ってオブジェクトレベルでマルチスレッド対応してるんかな?
0372デフォルトの名無しさん2015/01/06(火) 23:01:02.23ID:a1JT3SDg
>>242
遅くなりましたがあなたのお陰で解決しました。ありがとうございます!
0373デフォルトの名無しさん2015/01/06(火) 23:11:59.71ID:Z2lMmRuz
>>371
標準ライブラリは「constメンバ関数=マルチスレッド対応」で統一していたはずだが
0374デフォルトの名無しさん2015/01/06(火) 23:53:02.99ID:kiKfNKwr
>>369
シンタックスそんなに汚いかなあ、C++11
0375デフォルトの名無しさん2015/01/07(水) 00:17:19.84ID:Y9yyLQNc
>>373
じゃあ、コピーコンストラクタや代入演算子はダメなのかねー。
スマポの魅力半減。
昔、参照カウンタ方式のstringでエライ痛い目みたからなー…
0376デフォルトの名無しさん2015/01/07(水) 00:20:45.94ID:A8Vu2ukb
>>375
代入はだめだろ
けどコピーコンストラクタは、仮にもコンストラクタだし、オブジェクトを構築してるスレッド以外から手の触れようがないと思うが
0377デフォルトの名無しさん2015/01/07(水) 00:23:58.83ID:J9Js0gVS
shared_ptr自体はマルチスレッドに対応してるだろ
マルチスレッドでどれだけ参照を増やそうが減らそうがdeleteされなかったり2重deleteしたりしない
0378デフォルトの名無しさん2015/01/07(水) 07:10:13.57ID:Re9e7Fnn
それは君の環境で「自分で同期したら問題なく動いた」ってだけでは?
0379デフォルトの名無しさん2015/01/07(水) 09:05:13.51ID:DkZd7T6D
異なるshared_ptrに対する操作ならデータ競合を起こさないことが保証されてるよ
ttp://faithandbrave.hateblo.jp/entry/20130328/1364463249


同じshared_ptrに対する更新などの操作をデータ競合を発生させずに行うためのものも提供されてる
ttp://en.cppreference.com/w/cpp/memory/shared_ptr/atomic
0380デフォルトの名無しさん2015/01/07(水) 09:13:45.90ID:v+HQiVT1
WinのInterlickedExchage関数, QtのQAtomicIntみたいなもんか

型がTなのでより進化してるけど
0381デフォルトの名無しさん2015/01/07(水) 13:47:42.98ID:rq5tkzs4
>>379
それと所有するオブジェクト自体を複数のスレッドから操作する場合はmutexが必要になると。
0382デフォルトの名無しさん2015/01/07(水) 22:03:50.34ID:YcQby5xY
>>379
お前の脳内定義で保証されても
0383デフォルトの名無しさん2015/01/08(木) 02:00:31.36ID:AWCwNpvr
>>382
わざわざ解説書いてるリンク張ったのに理解できなかったのかな?
0384デフォルトの名無しさん2015/01/08(木) 02:11:41.75ID:5JSA30KW
>>382
わざわざ解説書いてるリンク張ったのに理解できなかったのかな?
0385デフォルトの名無しさん2015/01/08(木) 05:54:17.11ID:5XvFQQU/
vfw.hなどのライブラリーを使わず
複数のDIBファイル、通称ビットマップファイル、から
無圧縮aviファイルにする方法教えてください
2ギガ以上書き込みたいです
ホームページを探してもみつかりませんでした
0386デフォルトの名無しさん2015/01/08(木) 12:58:11.16ID:hmv0dwlG
>>385
DIBやaviのフォーマットは検索すれば見つかるだろ。
後はそれを実装するだけだ。
それがめんどくさい? 当たり前だ、その手間を省く為にライブラリーがあるんだから。
0387デフォルトの名無しさん2015/01/08(木) 13:08:02.49ID:5XvFQQU/
はぁ・・・
もうみつけたんですけど、
ウインドウズ固有のソースで読みにくいんだよね
ウインドウズは本当に害ですね
0388デフォルトの名無しさん2015/01/08(木) 13:25:59.97ID:ycTR+1MK
お前がアホなだけ
0389デフォルトの名無しさん2015/01/08(木) 20:06:08.43ID:5XvFQQU/
あなたは天才ですね
なのでもう一つ教えてください
ofstreamでオープンモードを読み込みにしたり書き込みにすることの
意味を教えてください
0390デフォルトの名無しさん2015/01/08(木) 21:39:03.88ID:EP4BCdt8
>>389
では教えてやろう
「ボクはバカです」
わかったらもう来るな
0391デフォルトの名無しさん2015/01/09(金) 01:49:38.56ID:bQFLimh0
なんでフォーマットって言ってんのにソースとか言い出すんだ?
0392デフォルトの名無しさん2015/01/09(金) 07:49:33.35ID:4rv3QFlx
>>389の質問は誰も答えてくれないんですか?

>>391
自分で検索してみたら?
0393デフォルトの名無しさん2015/01/09(金) 08:16:29.86ID:zK+nkrjj
パクろうとしてるんでしょ
0394デフォルトの名無しさん2015/01/09(金) 09:15:52.74ID:+YxGEmiz
32bitの実行ファイルから64bitの実行ファイルをウィンドウを表示させずに起動して、終了待ちにしたいのですが

調べたところこのような感じのことがネットに出ていたのですが、間違いないでしょうか
・systemではウィンドウを非表示にできない。
・ShellExecuteでは終了待ちができない。
・CreateProcessでは32bitから64bitを呼び出せない。
0395デフォルトの名無しさん2015/01/09(金) 09:20:52.80ID:Y0WqIXzk
>>394 スレ違い
Win32API質問箱 Build11
http://peace.2ch.net/test/read.cgi/tech/1418181169/
0396デフォルトの名無しさん2015/01/09(金) 18:58:31.35ID:BbdtG7U6
32bitって何ですか?
32ビット(32-bit)のこと?
0397デフォルトの名無しさん2015/01/10(土) 04:12:57.15ID:UxwFWFbB
・CreateProcessでは32bitから64bitを呼び出せない。

mjd?
ソースは?
0398デフォルトの名無しさん2015/01/10(土) 06:35:20.82ID:FA75abzu
転送先のスレで指摘されていたような
0399デフォルトの名無しさん2015/01/10(土) 08:15:50.16ID:ne+P9AZV
int と longってどう違うんですか?
0400デフォルトの名無しさん2015/01/10(土) 08:48:42.20ID:G15R7o4E
どう違うか気にしている時点でプログラミングのことがわかっていないという
証明だから、プログラミングから手を引いた方が幸せになれるよ。
0401デフォルトの名無しさん2015/01/10(土) 12:29:41.92ID:fcdmAEW8
>>400
引退宣言かな
0402デフォルトの名無しさん2015/01/11(日) 00:10:12.68ID:6BuzDaMr
>>399
longはintと同じかintより広い範囲の数値を表現できる
longはどんなコンパイラーでも-2147483647〜2147483647を表現できる
コンパイラーによるがたいてい4バイトか8バイト
例え同じサイズでも別の型なのでint *とlong *は互換性が無い
0403デフォルトの名無しさん2015/01/11(日) 02:01:29.39ID:vgCazd4z
int i = ...;
(i&0x01) == 0;
と
((i+1)&0x01) == 0x01;
って同値だよなぁ・・・?
0404デフォルトの名無しさん2015/01/11(日) 05:09:34.24ID:6BuzDaMr
いえ、オーバーフローしたら微妙です
0405デフォルトの名無しさん2015/01/11(日) 05:38:49.31ID:wv9edWGy
リトルエンディアンマシーンでuint32_tポインターを
int8_tポインターにreinterpret|castするとuint8_t[4]にリトルエンディアン
で並べたuint32_tデータになりますが、
これを全マシーンでやるには
uint32_tのLSByteからMSBbyteまでをビット演算子でuint8_t[4]に
コピーしなければなりません。
これは非効率です。
それなのでエンディアンを判別して場合分けするのが効率的と思いますが
みなさんはどのようにお考えなのでしょうか?
0406デフォルトの名無しさん2015/01/11(日) 05:44:07.92ID:wv9edWGy
#include <iostream>
using namespace std;
void b(char * x){

cout<<static_cast<int>(x[0])<<endl;
cout<<static_cast<int>(x[1])<<endl;
cout<<static_cast<int>(x[2])<<endl;
cout<<static_cast<int>(x[3])<<endl;
}
int main() {
int a;
b(reinterpret_cast<char *>(&static_cast<int>(1)));
a=1;
b(reinterpret_cast<char*>(&a));
return 0;
}
のようなコードで2-番目のbの呼び出しはaに値をコピーする効率が悪いので
1-番目のように直接値を渡したいのですができません。
0407デフォルトの名無しさん2015/01/11(日) 05:59:55.85ID:6BuzDaMr
>>406
>これは非効率です
そうか? 完全なコードだから精神衛生上いいだろ。
第一、バイトオーダーを意識するのはファイルI/Oや通信の時だけで
そんなに性能にシビアなケースは極めてまれでは

void b(int const &x);
cout<<static_cast<int>(1)<<endl;
cout<<static_cast<int>(a)<<endl;
0408デフォルトの名無しさん2015/01/11(日) 06:50:52.79ID:6BuzDaMr
中身書き忘れた
void b(int const &x)
{
 auto *p = reinterpret_cast<unsigned char *>(&x);
  cout<<static_cast<int>(p[0])<<endl;
}
0409デフォルトの名無しさん2015/01/11(日) 07:11:04.07ID:/K47z1BX
charをintに変換したらマイナス値があるわけだが
0410デフォルトの名無しさん2015/01/11(日) 07:32:00.10ID:6BuzDaMr
MIDIとかTIFFのフォーマットのように符合付きcharが出てくるものもある
そんなことより↓この程度の関数作るのがそんなに面倒なのか
void b(int const &x, char out[4]) {
  out[0] = static_cast<char>(x>>24);
  out[1] = static_cast<char>(x>>16);
  out[2] = static_cast<char>(x>>8);
  out[3] = static_cast<char>(x>>0);
}
int a(char t[4]) {
 auto *in = reinterpret_cast<unsigned char *>(t);
 return (in[0]<<24) | (in[1]<<16) | (in[2]<<8) | (in[3]<<0);
}
0411デフォルトの名無しさん2015/01/11(日) 08:15:07.21ID:K+Zx5WuE
わざわざ関数書かんでもntohl()使えばいいのに

ポインタや参照はあくまでもint32_tで扱って、値として解釈するときにuinl8_tにキャストすればいい

LANのプロトコル変換はみんなそうしてるし
0412デフォルトの名無しさん2015/01/11(日) 08:48:35.05ID:ahE2N+rE
>>411
処理内容が同じなら関数使い回しですねわかります
NWプログラムに限定してないのに環境依存の関数をホイホイ持ち込むなよ
0413デフォルトの名無しさん2015/01/11(日) 09:17:58.13ID:wv9edWGy
bはwrite関数を想定したので引数の変更はしません。
静的にエンディアンを調べる関数作ってつくれませんか?
reinterpret_castはconstexprに対応してないので無理ですか?
0414デフォルトの名無しさん2015/01/11(日) 09:48:15.71ID:2TgcD1gr
バイトオーダー 判定 静的
で検索すると最初に出てくるのでは?
0415デフォルトの名無しさん2015/01/11(日) 10:29:54.82ID:wv9edWGy
マクロしか出てこないんですけど
0416デフォルトの名無しさん2015/01/11(日) 11:10:16.45ID:wv9edWGy
#include <iostream>
using namespace std;
static constexpr union { // C++11
int one;
char isLittle;
} endian2 = {1};
static constexpr int endian4 = 1;
int main() {
static_assert(endian2.isLittle,"a");
static_assert( *(reinterpret_cast<const char *>(&endian4)),"b");
return 0;
}
5番目に出てきたやつもエラー
0417デフォルトの名無しさん2015/01/11(日) 11:16:06.50ID:3ahz/Tk9
>>406
#include <iostream>
using namespace std;
void b(const char * x){
cout<<static_cast<int>(x[0])<<endl;
cout<<static_cast<int>(x[1])<<endl;
cout<<static_cast<int>(x[2])<<endl;
cout<<static_cast<int>(x[3])<<endl;
}
int main() {
static const int a = 1;
b(reinterpret_cast<const char*>(&a));
return 0;
}
でいいだろ。
0418デフォルトの名無しさん2015/01/11(日) 11:44:40.56ID:pJY5lLXp
mapやlistでループ回して消していくとき、こいつが許されるのがどうも解せぬ
myMap.erase(it++);
後置インクリメントだと最初にitのコピーとるからOKってのは
こいつらのイテレータって実際のところ現在要素へのポインタに加えて次の要素へのポインタも常に所持してるってこと?
0419デフォルトの名無しさん2015/01/11(日) 12:53:48.13ID:pJY5lLXp
いやそんなわけないか。コピーとったところでそのイテレータは無効だよな
myMap.erase(it++);
は結局後置インクリメントもどき(演算子オーバーロード)だからit++の副作用完了点がはっきりしていてOKなだけで
元々の後置インクリメントの仕様に従うなら
itTmp = it++;
myMap.erase(itTmp);
でないと不自然なのか…
なんでC++11がmapのeraseでイテレータを返すようになったのか分かったわ
0420デフォルトの名無しさん2015/01/11(日) 12:59:35.81ID:pJY5lLXp
でもそうか、erase()に渡すのも副作用完了点だから問題ないのか…
0421デフォルトの名無しさん2015/01/11(日) 13:20:07.13ID:JubpmIiZ
auto e=it;
++it;
map.erase(e);
これと同じ
eraseしたときにそのiteraterだけ無効になる場合は問題ないってだけ
vectorはそうじゃないからダメ。
C++11でiterater返すようにされたのはコンテナのインターフェースを統一する為じゃない?
0422デフォルトの名無しさん2015/01/11(日) 13:47:43.02ID:K+Zx5WuE
bigかlittleか判別するだけなのになんでSTLとか出てくんの

int is_big_endian(void)
{
union {
uint32_t i;
char c[4];
} bint = {0x01020304};

return bint.c[0] == 1;
}
0423デフォルトの名無しさん2015/01/11(日) 15:38:36.63ID:SsF5QjFe
constexprとか静的って書かれているのに読めないの?
03で脳みその進化とまってるの?
0424デフォルトの名無しさん2015/01/11(日) 15:49:17.75ID:q6k5ufXA
>>415
>マクロしか出てこないんですけど

constexpr auto is_little_indian_byte_order() -> bool {
 return そのマクロの結果;
}
わかったら二度と来るな
0425デフォルトの名無しさん2015/01/12(月) 00:04:05.36ID:niAqRLwj
右辺値参照がさっぱりな人が
理解するにはどうしたらよいですか?
0426デフォルトの名無しさん2015/01/12(月) 00:09:39.01ID:Zdz3bMQt
式の左に置けるのが左辺値
右に置けるのが右辺値
0427デフォルトの名無しさん2015/01/12(月) 00:23:12.35ID:Aen7KAsb
↑典型的な誤回答
右辺値と右辺値参照は全く別の直交する概念なのに区別が付いていない
0428デフォルトの名無しさん2015/01/12(月) 00:25:26.47ID:Zdz3bMQt
>>427が区別がつく回答してくれるそうです
0429デフォルトの名無しさん2015/01/12(月) 00:34:40.73ID:UKDDVsgK
とりあえず最初は、自分で明示的にストレージ上に確保していないオブジェクトへの参照だと思っておけばいいよ。

struct X {};
X x; // 明示的に自動ストレージ上に確保
X *x = new X; // 明示的に動的ストレージ上に確保

auto return_object_function(){
X x;
return x;
}
X x = return_object_function(); // 関数から戻る途中に非明示的に確保されたオブジェクト、または関数から抜けた後には寿命が尽きるオブジェクトが存在する。
↑これへの参照。

その辺が何となく分かってきたらついでにstd::moveやstd::forward周りに目を向けていくとかで。
0430デフォルトの名無しさん2015/01/12(月) 00:39:20.05ID:Aen7KAsb
>>428
右辺値参照ってのは型の用語
変数や式には型がある
右辺値ってのは式の分類の用語
分類には左辺値(lvalue)と右辺値があって、右辺値にはxvalueとprvalueがある

例えばint &&a=0; b=a;の二つ目のaは型が右辺値参照型(int &&)で、式の分類が左辺値(lvalue)だ
int f(); f();の二つ目のf()は型がintで、式の分類が右辺値(prvalue)だ
0431デフォルトの名無しさん2015/01/12(月) 00:54:16.61ID:Aen7KAsb
右辺値参照型(X &&)の変数は参照初期化時に右辺値(xvalue/prvalue)を受け取れる
左辺値参照型(X &)の変数は参照初期化時に右辺値(lvalue)を受け取れる
非参照型(X)の変数は初期化時に(コピーする事で)何でも受け取れる
例外的にconstな左辺値参照型(const X &)の変数は右辺値も左辺値も受け取れる
0432デフォルトの名無しさん2015/01/12(月) 01:20:01.94ID:sbycDOHU
右辺値参照理解するには、C++11の環境で&&での参照渡しやstd::move使ったコード書いてデバッガで眺めればわかるよ、サンプルならそこらじゅうにある
0433デフォルトの名無しさん2015/01/12(月) 08:16:50.67ID:J2tnL5cC
>>431
屋上屋かさねた割には整然としたルールだな
例外も多いんだろうか
0434デフォルトの名無しさん2015/01/12(月) 08:53:03.53ID:wfmgjEuF
マイクロソフトの構造体で
wが初めにつくのはワードdwが付くのはdwということはわかるんですけど
ワードでもnがついていたりcbが付いていたりするのもあります。
何を意味するのかおしえてください
0435デフォルトの名無しさん2015/01/12(月) 08:58:58.23ID:XyI4+M3+
>>434
飾りです。気にする必要はありません。
0436デフォルトの名無しさん2015/01/12(月) 09:00:40.68ID:wfmgjEuF
どうしても教えてください
0437デフォルトの名無しさん2015/01/12(月) 09:19:12.95ID:6zu7sfus
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95
0438デフォルトの名無しさん2015/01/12(月) 09:20:38.53ID:mp+hxBsF
>>434
「ハンガリアン記法」で調べろ。
答えだけ書くと、n は 「数」で、cb は「バイト数 (count in bytes)」だな。
0439デフォルトの名無しさん2015/01/12(月) 09:40:33.97ID:wfmgjEuF
ありがとうございます
#include <iostream>
using namespace std;
class A{
public:
virtual void print(){
cout<<"A"<<endl;
}
};
class B:public A{
public:
void print(){
cout<<"B"<<endl;
}
};

int main() {
B b;
A &a =b;
b.print();
a.print();
// your code goes here
return 0;
}
出力
B
B
となるのはなぜでしょう?
B
A
になるはずなんですが
0440デフォルトの名無しさん2015/01/12(月) 09:44:13.76ID:9hDSjIUk
virtualついてるからに決まってだろ
0441デフォルトの名無しさん2015/01/12(月) 09:50:13.80ID:J2tnL5cC
using namespace std; は馬鹿の目印
0442デフォルトの名無しさん2015/01/12(月) 12:23:36.08ID:idPPFXw9
C#と違って基底クラスの関数がvirtualだと
勝手にvirtualになる糞言語だから
0443デフォルトの名無しさん2015/01/12(月) 13:10:17.65ID:M7RGznEr
そういうレベルではなく
継承による多態はポインタだけでなく参照のときでも機能するから
というレベルの話ではなかろうか
0444デフォルトの名無しさん2015/01/12(月) 13:14:24.87ID:8uRWmwlS
>>443
俺もフツーにそういう話かとおもったが…
0445デフォルトの名無しさん2015/01/12(月) 13:54:49.26ID:ytosSIWd
>>441
何でですか?
0446デフォルトの名無しさん2015/01/12(月) 13:58:14.39ID:ytosSIWd
>>431
右辺値参照なんていうのはc++だけの
文法ですか?他の言語にもこんな変な
文法有りますか?
c#には、こんなの無いように思うんですが。
どうしてc++はこんな変な方向に
拡張されて行くんですか?
0447デフォルトの名無しさん2015/01/12(月) 14:32:57.40ID:XyI4+M3+
効率厨だから
0448デフォルトの名無しさん2015/01/12(月) 14:41:52.32ID:mp+hxBsF
>>447
煽っているように見えて、真実なんだよなぁ
0449デフォルトの名無しさん2015/01/12(月) 17:54:30.45ID:wfmgjEuF
ありがとうございます。
#include <iostream>
using namespace std;
template<typename T>
void print(T a){
cout<<a<<endl;
}
template<typename... T>
void print(T a,T... b){
cout<<a<<endl;
print(b...);
}
int main() {
print(1,2,3,4);
return 0;
}
このように可変引数でそれぞれの引数の型をTに統一したい場合どうやって書けばいいのでしょうか?
上のようにやるとエラーになります。
0450デフォルトの名無しさん2015/01/13(火) 03:23:48.60ID:2zJXl9HC
#include <iostream>


template <typename T>
void print( T a )
{
std::cout << a << std::endl;
}

template <typename Head, typename ...T>
void print( Head a, T... b )
{
std::cout << a << std::endl;
print( b... );
}

int main()
{
print( 1, 2, 3, 4 );
}

じゃあかんのか。型を統一したいというが、それであれば可変長テンプレート引数を用いるのは間違いな気がする(テンプレート引数というのは基本的に型を実引数に受け取るものだ。)
0451デフォルトの名無しさん2015/01/13(火) 03:24:16.56ID:2zJXl9HC
どうしてもというならこんな感じde

#include <iostream>

template <typename Head, typename ...T>
struct print {
void operator()( Head a, T... b ){
std::cout << a << std::endl;
print<T...>{}( b... );
}
};
template <>
struct print<int> {
void operator()( int a ){
std::cout << a << std::endl;
}
};
// 実使用部.
template <typename ...T>
void serial_print( T... a ){
print<T...>{}( a... );
}

int main()
{
serial_print( 1, 2, 3, 4 );
//serial_print( 1, 2.0f, 3.0, 4ul ); // こちらを入れるとエラー.
}
0452デフォルトの名無しさん2015/01/13(火) 11:01:26.11ID:rpb923HK
テンプレートの意味がまるで無いコードですね
0453デフォルトの名無しさん2015/01/13(火) 11:26:02.29ID:9boVeRRQ
std::initializer_list<T> を引数に取るのが素直なのかな?
いつの間にか std::min() max() もそうなっていたし。 → std::min( { 1, 2, 3 } )
0454デフォルトの名無しさん2015/01/13(火) 11:32:36.65ID:Na/JFQe7
std::min({ 1, 2, 3 });
うーんこの
理屈は通ってもこの無駄な{}が感情的になぁ・・・
0455デフォルトの名無しさん2015/01/13(火) 11:59:37.92ID:9OgL8QDI
すみません
print<T...>{}( b... );
print<T...>{}( a... );
これどういう意味ですか?
0456デフォルトの名無しさん2015/01/13(火) 12:06:08.01ID:cjipnmCJ
こんな訳分からんC++なんて
何か間違っている。C#がネイティブ
になれば、皆んなC#へ行くだろう。
0457デフォルトの名無しさん2015/01/13(火) 12:33:38.89ID:GS0/TJB9
行かない
0458デフォルトの名無しさん2015/01/13(火) 12:52:02.60ID:9boVeRRQ
可変長テンプレートは望まれていた機能だし、訳分からんとは思わないな。
今は関数型言語っぽい書き方が必須になるのが難点だけど、
次の規格では手続き型っぽく書ける改良案も出ていると聞いた。
0459デフォルトの名無しさん2015/01/13(火) 12:57:44.24ID:n6XeFbSo
>>455
print :クラステンプレート
<T ...> :テンプレートパラメータパックTを展開しそれを引数としてクラス定義を生成(インスタンス化)
{} :デフォルトコンストラクタでクラスの一時変数を構築
(b ...) :関数パラメータパックbを展開しそれを引数としたクラスのメンバ関数operator()の呼び出し
0460デフォルトの名無しさん2015/01/13(火) 12:58:46.94ID:MFk51EzE
全ての機能を把握して正しく使おうとすると、覚えることが多過ぎる
0461デフォルトの名無しさん2015/01/13(火) 13:05:04.90ID:Na/JFQe7
よくわからない(理解する気がない)機能は単に使わなければいい
0462デフォルトの名無しさん2015/01/13(火) 13:07:22.47ID:rpb923HK
割合短くなった
#include <iostream>
using namespace std;

template<typename... T>
void print(T... args){
for (auto&& v : {args...})
cout<<v;
cout << endl;
}
int main() {
print(1,2,3,4);
return 0;
}
0463デフォルトの名無しさん2015/01/13(火) 16:06:28.44ID:t3KRTwNe
javaでいう
intBitsToFloatに変わる方法無いですか?
0464デフォルトの名無しさん2015/01/13(火) 16:45:31.53ID:9boVeRRQ
int i = ...;
float f = reinterpret_cast<float&>(i);
0465デフォルトの名無しさん2015/01/13(火) 16:50:17.98ID:x7fsXOyW
>>463
なんやよ〜わからへんけど、共用体一発ちゃうんか
0466デフォルトの名無しさん2015/01/13(火) 18:11:30.57ID:rpb923HK
>>464
strict aliasing ruleで未定義動作やね
0467デフォルトの名無しさん2015/01/13(火) 18:35:38.34ID:JqWo+LRV
int→float&のreinterpret_castなんてできたっけ?
*reinterpret_cast<float *>(&i)ならわかる
0468デフォルトの名無しさん2015/01/13(火) 19:09:50.47ID:9OgL8QDI
ありがとうございます。
すみません
{args...}
ってなんですか?
0469デフォルトの名無しさん2015/01/13(火) 19:16:35.25ID:9boVeRRQ
>>466
恥ずかしながら >>467 と同じ意味だと思ってた。
この使い方だと最適化の有無で動作が変わっても文句言えないってことなんだね。
0470デフォルトの名無しさん2015/01/13(火) 19:30:36.95ID:rpb923HK
>>469
同じ意味だよ。>>467も未定義動作
0471デフォルトの名無しさん2015/01/13(火) 20:42:56.94ID:k+Bq5xib
0クリアする時は、

strcpy(a,"0");
と
a[0]='0';a[1]='\0'

どっちが良いですかね。速度的にけっこう違うんですかね
0472デフォルトの名無しさん2015/01/13(火) 21:04:14.51ID:rpb923HK
>>468
initializer_listの構築。for以外でも使いたいなら auto lst = { args... }; とするといいよ。

>>471
それを0クリアというのか?
それはともかくstd::stringを使えよ。C形式の文字列なんぞ人生の無駄。
0473デフォルトの名無しさん2015/01/13(火) 21:17:24.37ID:8O2Z+zCU
上は
a[0]='0', a[1]='\0', a[2]以降は未定義

下は
a[0]='0', a[1]='\0', a[2]以降は未定義

だと思うんだが…配列長がいくつかは分からないけど全く0クリアできてなくないか
0474デフォルトの名無しさん2015/01/13(火) 21:23:59.73ID:k+Bq5xib
単純に”0”を一文字入れたかっただけです。
聞き方が悪かったです。どうもありがとうございました。
0475デフォルトの名無しさん2015/01/13(火) 22:06:04.28ID:kD9wDfw4
std::stringってascii文字以外も使えますか?
wcharとか_TCHARとかあってわけわかりません。
多くのモダン言語では、asciiもShift-JISもUnicodeも統一的に扱えるようになっていると思いますが、
C++では、
ascii文字列ではstd::string
ワイド文字列ではstd::wstring
…
という風に使い分けないといけないんでしょうか。
0476デフォルトの名無しさん2015/01/13(火) 22:16:27.73ID:Ph/HUQCj
他は大体unicodeに統一されているだけで
変換は必要だろう
0477デフォルトの名無しさん2015/01/13(火) 22:17:43.73ID:Lg8oVsZy
アスキーだろうがマルチバイトだろうがバイナリだろうが
何でも入るよ
0478デフォルトの名無しさん2015/01/13(火) 22:28:24.20ID:9boVeRRQ
>>475
複数の文字コードをそのまま扱える言語なんて、Rubyと一部DBのSQLくらいじゃないの?
読み込みの際に変換しているだけだと思うが。

mbstowcs なり MultiByteToWideChar なり ICU なり、用途に叶うものを使えば良い。
リテラルも "..." と L"..." があって使い分けることになる。
0479デフォルトの名無しさん2015/01/13(火) 22:42:07.36ID:kD9wDfw4
>>478
> 読み込みの際に変換しているだけだと思うが。

そういうことです。
モダン言語では、初期化の際に共通の内部表現に変換するようになっていると思いますが、
C++では速度を重視しますから、常に文字コードを意識しないといけないんですね。
そこが辛いなと。Windows界隈ではさらにShiftJISまで混ざってきますから。
0480デフォルトの名無しさん2015/01/13(火) 22:48:55.18ID:3wxgn30U
といっても、Windowsも実は内部コードがutf-16で、
ShiftJISを取るAPIもこっそり文字コード変換してるんだけどな
0481デフォルトの名無しさん2015/01/13(火) 23:37:30.93ID:xMsK2Lyv
>C++では速度を重視しますから、常に文字コードを意識しないといけないんですね

いやそんなことはない
C#: new StreamReader("fname", Encoding.UTF8)
C/C++: _ftopen(_T("fname"), _T("r, ccs=UTF-8"))
何が違うというのか
0482デフォルトの名無しさん2015/01/13(火) 23:38:35.93ID:Ph/HUQCj
文字コードの意識はほかの言語でも必要だろう
0483デフォルトの名無しさん2015/01/13(火) 23:46:17.82ID:Lwgt1osN
>>456
実行速度が劇的に変わる訳でも無いのにネイティブコード吐くぐらいで移行してる人なら既に移行してないとおかしい。
.Net Nativeってのが既に発表されてるし。

>>470
float& f = reinterpret_cast<float&>(i);
f = 2;
ってやったとき、iの値が未定義なのがstrict aliasing ruleじゃねえの?
0484デフォルトの名無しさん2015/01/13(火) 23:52:48.64ID:x7fsXOyW
意識の度合いが違うわな。
unicode対応といってもu16stringやu32stringみたいな固定ビット数のばっかで、
utf8を文字数単位で操作とかできんし。所詮は配列の延長。
LL系ならutf8を文字数単位とか普通にできるっしょ。
0485デフォルトの名無しさん2015/01/13(火) 23:55:30.09ID:SFP9piLh
はつみみです
0486デフォルトの名無しさん2015/01/14(水) 00:05:25.89ID:JfPiamoA
文字数単位ってコードポイント単位の事だよね?
u32stringに変換して使えばええやん。

それとも他の言語だと結合文字も考慮された文字数返すの?
AndroidなんかはUTF-16で組み込みのTextViewがサロゲートペアすらちゃんと扱えてなかったけど
0487デフォルトの名無しさん2015/01/14(水) 00:05:32.85ID:mXgizPws
tcpでバイナリデータ受信し、決められたフォーマット(リトルエンディアン)に従ってデコードしたいのですがうまく書けません。
istringstream辺りを使ってByte配列→Intにしようとしたのですがこれって
"0100"→100 みたいな動作ですよね。
'01' '00'→1 みたいな動作にするのになにか良い方法は無いでしょうか?

c#のBinalyReaderみたいなのが欲しいのですが。
0488デフォルトの名無しさん2015/01/14(水) 00:07:26.39ID:kmmQ1SrF
tclなんて内部コードはutf8だけど、
string index "fooあほbar禿" 4
とかやればちゃんと4文字目を返すぞ。
0489デフォルトの名無しさん2015/01/14(水) 00:42:43.62ID:mWlEZDlJ
>>487
適当にシリアライズしてくれるライブラリ使え
0490デフォルトの名無しさん2015/01/14(水) 00:46:33.63ID:IAjpd3c2
>>487
色々あると思うけど
Poco::BinaryReaderとか
0491デフォルトの名無しさん2015/01/14(水) 01:06:06.18ID:yeQHjBGO
初期化リストのシンタックスに迷います
: の後ろに改行せずに書くと長くなりますし
: の後ろで改行すると初期化リストの後で { を置く場所が微妙になります
{ の前で改行しない派ですが、
初期化リストの後ろは{}内の文と分けるために{の前で改行か{の後ろに空白行を挟みたくなります
みなさんどのように書いていますか?
0492デフォルトの名無しさん2015/01/14(水) 01:54:17.10ID:PZtFq0gG
>>470
ダメな型で読み取りあるいは書き込みしただけでプログラムの動作が未定義になる。それが aliasing rule
https://www.google.co.jp/search?q=aliasing+rule
04934922015/01/14(水) 01:55:11.33ID:PZtFq0gG
ごめんアンカーミスった。
>>492 は >>483 宛てね。
0494デフォルトの名無しさん2015/01/14(水) 06:41:52.32ID:OCa2o/9X
テスト
0495デフォルトの名無しさん2015/01/14(水) 07:02:04.08ID:Z38vlg9A
>>491
短い時
int foo::foo(int i): bar(i) {
長い時
int foo::foo(int i)
 : bar(i)
{
引数が長い時
int foo::foo(
 int i
): bar(i)
{
0496デフォルトの名無しさん2015/01/14(水) 07:21:03.59ID:NO/MtwMN
コンストラクターは戻り値していできないんじゃ
0497デフォルトの名無しさん2015/01/14(水) 07:25:03.59ID:9mIVwc3/
>>492 は何か勘違いをしているのではないか?
reinterpret_cast や intptr_t の存在意義を否定しているし、
バイト配列を他の型として解釈することもできなくなる。

万が一ダメだとしても、"aliasing" という名前ではないだろう。 エイリアスしてない。

「未定義」の意味が「環境依存」ということなら、一理ある。
floatの内部表現はIEEE754とは限らないし、その場合intとして解釈した際のビット表現は異なるから。
0498デフォルトの名無しさん2015/01/14(水) 07:50:37.62ID:XJt8CAXI
>>489
>>490
回答ありがとうございます。
外部ライブラリに頼った方がいい感じなんですね。
自分でも探してみます。
0499デフォルトの名無しさん2015/01/14(水) 08:06:14.46ID:Z38vlg9A
>>496
ああ、すまん
寝ぼけてたわ
0500デフォルトの名無しさん2015/01/14(水) 09:14:54.40ID:NO/MtwMN
template<bool a,typename T>
void f();

template<typename T>
void f<true,T>(){
cout<<2<<endl;
}
template<typename T>
void f<false,T>(){
cout<<1<<endl;
}
がエラーになるのですがどうしたら治せますか?
typename Tが無ければコンパイルできます
0501KUSO KOTE ◆unko./w.Osri 2015/01/14(水) 17:30:39.42ID:QxKXhXqS
>>500
関数テンプレートは部分特殊化できないので
クラスの静的関数にしてクラスの部分特殊化します。
template<bool , typename T>
struct unko {
 static void f();
};
0502デフォルトの名無しさん2015/01/14(水) 18:05:05.38ID:NO/MtwMN
ありがとうございます
0503KUSO KOTE ◆unko./w.Osri 2015/01/14(水) 19:55:07.79ID:1m+aHuMw
>>502
もしくは関数のオーバーロードで見苦しい判定をします。
http://ideone.com/dccIYJ

どうして関数テンプレートが
明示的特殊化できて部分特殊化できないのかは謎。
0504デフォルトの名無しさん2015/01/14(水) 21:28:06.62ID:zTGSPoHK
俺のC++がこんなに難解なわけがない
0505デフォルトの名無しさん2015/01/14(水) 21:52:16.82ID:49lpCiLZ
ループ中にvector宣言を置くとどんどんサイズが大きくなっていくのですが、
どうしたらいいでしょうか?

http://www1.axfc.net/u/3392298.png
0506デフォルトの名無しさん2015/01/14(水) 21:58:33.46ID:bm2MApp4
糞汚いソースだな
画像で見せるとか嫌がらせか
>>1見ろよ
0507デフォルトの名無しさん2015/01/14(水) 21:58:49.58ID:ZzJLW/vD
「男性のオナニーのために作られたエロゲーです」
という表示しかでないんだが
0508デフォルトの名無しさん2015/01/14(水) 22:00:45.52ID:lSekNf1K
>>487
htonlとかntohlとかじゃダメなのか?
ネットワークバイトオーダーからホストバイトオーダーではなく、また別のエンディアンにしたいとか?
05095052015/01/14(水) 22:12:04.41ID:49lpCiLZ
こうですか?
49行目あたりです
http://codepad.org/j6q5zVzR
0510デフォルトの名無しさん2015/01/14(水) 23:09:34.38ID:0+tysiB0
なんでCなのさ
0511デフォルトの名無しさん2015/01/14(水) 23:18:11.49ID:C/fj4qd2
>>509
gccでコンパイルして実行してみたけど増えなかった
コンパイラ何使ってんの?
0512デフォルトの名無しさん2015/01/14(水) 23:20:54.98ID:Vq7xvVBb
いつから増えると錯覚していた?
チンコがおっきくなるって話だぞ
05135052015/01/15(木) 00:12:20.40ID:v4qaNDh8
今リビルドしてみたら正常にできました。
なんか調子が悪かったみたいです。

$ gcc --version
gcc.exe (Built by MinGW-W64 project) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ちなみにちんこがおっきするのは正常です
0514デフォルトの名無しさん2015/01/15(木) 01:00:51.69ID:cO4EXxPx
>>497
そういう勘違いをしてる人が多かったからリンク先のように多くの記事がある。
まずはひとつふたつでも目を通してから出直してこいよ。
0515デフォルトの名無しさん2015/01/15(木) 08:23:42.79ID:xGg1V32b
>>514
http://blog.qt.digia.com/blog/2011/06/10/type-punning-and-strict-aliasing/
がわかりやすいかも。 ただ、エンディアンの違いを除けば、
問題が表面化したのはやはり書き換えを伴うケースだけのようだ。

unionまで禁止されるとかなり手段が限定されるな。 memcpyなら問題ないのかな?
memcpy(&intVal, &fltVal, sizeof(float))
0516デフォルトの名無しさん2015/01/15(木) 09:09:19.37ID:fAB5K+xN
>>514
何が言いたいのか解らないんだけど
0517デフォルトの名無しさん2015/01/15(木) 18:55:52.43ID:sN1/S68L
std::ios::pos_typeは整数型ではないじゃないですか
それなのに
file.seekg(0);
のような実装依存の使い方がなんで許されるんですか?
0518デフォルトの名無しさん2015/01/15(木) 19:58:24.98ID:TqxoI/23
コンストラクタで整数型を受け取れるようになっているから
0519デフォルトの名無しさん2015/01/15(木) 20:16:47.78ID:aaSxoVnF
>>515
void*から元の型でないものにキャストするのは不定だから。
あと、sizeof(int)とsizeof(float)が同一じゃないと飛ぶ。
結局、こういう操作は機種依存、コンパイラ依存ということで腹をくくるしかないかと。
で、機種依存は標準ライブラリが吸収すると。
0520デフォルトの名無しさん2015/01/15(木) 20:38:10.90ID:Nl0/WaUm
>>519
strict aliasing ruleの話だったのになんでそういう話に行っちゃうの?
sizeが一致してる事なんて当たり前のこととして誰も触れてなかったのに
0521デフォルトの名無しさん2015/01/15(木) 22:41:18.20ID:xGg1V32b
>>519
intptr_t というポインタ値を格納できる整数がある以上、不定なんて簡単に斬り捨てるのはナンセンスだ。
異なる環境で結果の生ビットのイメージが異なると言いたいのか、
同じ環境でも例えば最適化の有無で結果が変わるのか、
明確にすべきではないのか? 前者なら覚悟の上だし、後者なら確かに注意が必要だ。
0522デフォルトの名無しさん2015/01/16(金) 00:57:50.61ID:7ptlesNF
>>521
元のポインタ型に reinterpret_cast で戻せば元のポインタの値が得られることは保証されてる。
整数としての値について規格での保証はなく、処理系定義となっている。

ポインタ間の reinterpret_cast もだいたい同じ。ただし aliasing rule で許される範囲の型で
あれば、変換されたポインタを通したアクセスはできる。要件に合わない型でアクセスした場合の
動作は未定義。

規格で未定義とされた結果についても、コンパイラベンダがユーザーからの要望を受けるなどして
何かしらの結果を保証することは考えられる。
0523デフォルトの名無しさん2015/01/16(金) 10:59:13.92ID:6pAX4ek9
未定義マンは未定義を連呼するだけで実生活の役には立たないな
0524デフォルトの名無しさん2015/01/16(金) 13:31:51.37ID:5KcpH9lX
実生活に役立つC++知恵袋
0525デフォルトの名無しさん2015/01/16(金) 16:10:28.75ID:TPIs3k36
君の将来もundefined
0526デフォルトの名無しさん2015/01/16(金) 17:28:22.93ID:lE2P5Fdt
noexceptって例外を投げないコンストラクタやメンバ関数には必ず付けたほうがいいですか?
ググったらコンパイラによる最適化が働くとあったのですが
0527デフォルトの名無しさん2015/01/16(金) 17:42:22.71ID:b+iOL8G+
noexcept地獄w
0528デフォルトの名無しさん2015/01/16(金) 17:52:28.97ID:lE2P5Fdt
地獄です
そんなに神経質になる必要ないですよね?
0529デフォルトの名無しさん2015/01/16(金) 18:54:26.90ID:XnO0vYpJ
ファイルに10000個0を書き込むのに
file.put(0)を10000回す方法に
疑問を感じるのですが
これであってますか?
0530デフォルトの名無しさん2015/01/16(金) 19:08:46.79ID:49OvZmoV
動けば何でもいいんじゃない?
0531デフォルトの名無しさん2015/01/16(金) 19:42:47.87ID:5KcpH9lX
連長圧縮を効かせるべき
file.puts("0 x 10000")
0532デフォルトの名無しさん2015/01/17(土) 00:27:55.42ID:gZ92P3CR
file << string(10000 '0');
0533デフォルトの名無しさん2015/01/17(土) 02:47:46.15ID:A0mHqxo/
0x30
0534デフォルトの名無しさん2015/01/17(土) 10:19:37.62ID:+Mt2ocGr
memsetで配列に0x30充填してファイルに書き出す
0535デフォルトの名無しさん2015/01/17(土) 11:40:25.95ID:lX6OVvpV
ストリームバッファーのバッファーですか?
0536デフォルトの名無しさん2015/01/17(土) 13:00:04.69ID:cwk2gnL9
多段に何か問題が?
0537デフォルトの名無しさん2015/01/17(土) 17:48:09.90ID:8pCUt2oz
問題ないさーーー
0538デフォルトの名無しさん2015/01/17(土) 21:00:26.16ID:KOOYDoMc
なんくるないさー
0539デフォルトの名無しさん2015/01/18(日) 07:38:41.69ID:u9sBSLL+
noexcept付けて例外出したらどうなるのが正しいの?
void f() noexcept {throw 0;}
0540デフォルトの名無しさん2015/01/18(日) 07:55:20.39ID:AOSxsRns
is_unko<T>::value より
is_unko<T>() の書き方の方がいいんですか?
0541デフォルトの名無しさん2015/01/18(日) 08:01:37.80ID:Qm+dorGN
コンパイルエラーなんじゃないの?
0542デフォルトの名無しさん2015/01/18(日) 08:24:53.10ID:AOSxsRns
>541
あすみません is_unko<T>()() です
0543デフォルトの名無しさん2015/01/18(日) 11:37:47.66ID:P6WGkqwh
>>539 std::terminate()
0544デフォルトの名無しさん2015/01/18(日) 22:23:35.79ID:bHrYEHGA
cygwinのg++でto_stringを使おうとするとnot a member of stdとでてしまいます
バグっぽいんですが,どうしてもwindowsでto_string使いたいならvisual studio使うしかないですか?
0545デフォルトの名無しさん2015/01/18(日) 22:29:58.97ID:jDPvnKP1
Cygwinって情弱が使う奴?
0546デフォルトの名無しさん2015/01/18(日) 23:26:59.29ID:a8z2TDtD
cygwinのgccってバージョンいくつだっけ?未実装の機能なんじゃないか
未実装でもどうしても使いたければ自分で書けばいい
boost.lexical_castに丸投げしとけばだいたいは充分だろ
0547デフォルトの名無しさん2015/01/18(日) 23:59:19.39ID:zFYM1lrS
MinGWに問題があるみたいだね
0548デフォルトの名無しさん2015/01/19(月) 07:19:01.71ID:FNsfOjWe
オープンソースって割にはオープンに直せないんだな
0549デフォルトの名無しさん2015/01/19(月) 07:47:27.60ID:Cyk/lQNq
オープンに直すって具体的に何すんだ?
0550デフォルトの名無しさん2015/01/19(月) 10:20:13.34ID:KaaVf0G8
オープンとアナーキズムは全く異なる
0551デフォルトの名無しさん2015/01/19(月) 10:48:53.28ID:2mIA9VDn
だれでも自由に直せることと
それを本家が取り入れることは別の話
0552デフォルトの名無しさん2015/01/19(月) 13:18:15.00ID:Tsvh6ToP
>>544
-std=c++11
0553デフォルトの名無しさん2015/01/19(月) 15:17:08.76ID:Tsvh6ToP
確かにcygwin 32,g++4.9.2であかんね。
自家ビルド4.9.2 on cent6ではいける。
ヘッダにはちゃんとto_stringあるのにプリプロセスで消えてるわ。
0554デフォルトの名無しさん2015/01/19(月) 17:15:48.17ID:Tsvh6ToP
c++config.hで_GLIBCXX_USE_C99とやらが定義されてないのが原因だな。
ビルド時にやらかしたのだろう。
旧バージョン4.8.3に戻せば使えるかもね、to_string
0555デフォルトの名無しさん2015/01/19(月) 17:31:53.40ID:FNsfOjWe
int a[10000000000]
for(int i=0;i<10000000000;++i)
a[i]=i;

for(int i=0;i<10000000000;++i)
*(a++)=i;

while(a!=a+10000000000)
*(a++)=i;

早い順に並べてください
もしこれ以外にもあったらそれも入れて良いです
0556デフォルトの名無しさん2015/01/19(月) 17:55:39.74ID:zs9lS2Em
色々おかしいが、やりたいことが
始めの奴と見なせばどれも変わらない
最適化で差は消えるし、最適化かけずとも
そんなにでかいメモリ領域へのアクセスをしたらメモリ帯域で制限される。
0557デフォルトの名無しさん2015/01/19(月) 19:19:24.77ID:G7rK5Vbu
右辺値の配列変数に代入している時点で
0558デフォルトの名無しさん2015/01/19(月) 20:42:07.30ID:JaWjPBIf
関係ないけど配列変数って右辺値なんだな
なんかもっと特殊なカテゴリーに入るんだと思ってた
0559デフォルトの名無しさん2015/01/19(月) 22:26:46.76ID:xXNXoN/7
いえ左辺値です
嘘つきに騙されないで下さい
0560デフォルトの名無しさん2015/01/19(月) 22:39:28.43ID:5YlZfexY
はぁ?
lvalue required as increment operand
a++;
0561デフォルトの名無しさん2015/01/19(月) 22:43:35.22ID:op5GXgGv
4.2 Array-to-pointer conversion
1 An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The result is a pointer to the first element of the array.
とある。
0562デフォルトの名無しさん2015/01/19(月) 23:02:01.28ID:5YlZfexY
int a[10];
でaは左辺値にはならんだろ。

void func(int a[10])
なら、aは左辺値になるだろうが、実態はポインタだけどな。
0563デフォルトの名無しさん2015/01/19(月) 23:14:11.45ID:W9kUD6JH
http://ideone.com/4yDkFQ
どうみても左辺値です

ISO/IEC 14882:2011 5.1.1p8
The result is an lvalue if the entity is a function, variable,
or data member and a prvalue otherwise.
0564デフォルトの名無しさん2015/01/19(月) 23:37:54.50ID:op5GXgGv
>>563
T (&ar)[N] で受ければ左辺値かもしれないが、自分的にはちょっとあやふやだ。

しかし>>555の書き方だと暗黙のポインタ変換されたあとの値ではないだろうか。
つまり右辺値だと思う。
static_cast<int*>(a)++; とやったらエラーなのと同じだ。
0565デフォルトの名無しさん2015/01/19(月) 23:49:28.75ID:5YlZfexY
>>564
int a[10];
a++;
とやると>>560となるわけよ。
lvalueをくれと言われる。
まあ、constのlvalueなのかもしれんけど。
0566デフォルトの名無しさん2015/01/19(月) 23:49:38.83ID:QfMkzxCw
int a[10]; のaは右辺値
func(T (&ar)[N])のarは左辺値
だろ? 違うのか? 
0567デフォルトの名無しさん2015/01/19(月) 23:50:31.01ID:W9kUD6JH
>>564
>暗黙のポインタ変換されたあとの値ではないだろうか

それは>>560のようなバギーなコンパイラだけ
正しいコンパイラは配列名を左辺値として扱う
0568デフォルトの名無しさん2015/01/20(火) 00:01:36.36ID:g9uhdRDJ
>>560はg++4.9.2

cl v15では、
'++' needs l-value

困ったもんですな。
まあ、どちらにせよ、++はconstのlvalueはつかえないから、int a[10]; a++;はダメなんだけどね。
(関数引数はOK)
0569デフォルトの名無しさん2015/01/20(火) 00:16:57.39ID:g9uhdRDJ
clang++は
cannot increment value of type 'int [10]'
ですな。
lvalueかどうかという理由ではなく配列型だからダメと。
これがマトモなコンパイラということでよろしいですかな?>>567
05705672015/01/20(火) 00:20:35.92ID:xmwiqoSR
>>569
そだね
++演算子の仕様を読んでいたら そういうメッセージになるはず
VCとg++は式のvalue categoryをきちんと実装してないと見た
0571デフォルトの名無しさん2015/01/20(火) 00:31:01.30ID:Vtu26NEG
>>566
自分はそれが正解だと思う。
実引数である a は右辺値だけど仮引数である ar は左辺値だと。

func(int&& a)
の a は右辺値参照で右辺値しか受け取れないけど、 a そのものは左辺値だしね。
0572デフォルトの名無しさん2015/01/20(火) 00:48:29.69ID:gowFJy9K
aは性質的には右辺値に近い気がするんだけど
仕様的には左辺値でも右辺値でもない特殊扱いってこと?
0573デフォルトの名無しさん2015/01/20(火) 00:57:13.79ID:Vtu26NEG
>>563
の根拠はちょっとおかしいと思う。
どう見ても左辺値だって言うけど、それは関数仮引数の ar がそうだってだけでは?
0574デフォルトの名無しさん2015/01/20(火) 01:16:04.26ID:MYJPw26J
>>573
int ar[1];
int (&& rr)[1] = (ar); // もしint[1]型の右辺値ならint(&&)[1]型変数を初期化できるはず
int (& lr)[1] = (ar); // もしint[1]型の右辺値ならint(&)[1]型変数を初期化できないはず
0575デフォルトの名無しさん2015/01/20(火) 01:24:19.84ID:MYJPw26J
この方がわかりやすいか
using array = int[1];
array a1:
array & lr = a1; // OK
array && rr = a1; // error
0576デフォルトの名無しさん2015/01/20(火) 01:34:04.82ID:MYJPw26J
おまけ
using array = int[1];
struct A {array v;};
array & lr = A{}.v; // error, rvalue of type int[1]
array && rr = A{}.v; // OK
0577デフォルトの名無しさん2015/01/20(火) 12:45:49.02ID:sX5O42FC
左辺値=どこかのメモリ領域に確保されたオブジェクト
右辺値=実体はともかく意味している値そのもの
と考えるとわかりやすい。配列は前者
0578デフォルトの名無しさん2015/01/20(火) 14:08:10.14ID:gowFJy9K
>>577
議論になってるのは配列そのもののことじゃないだろ
int a[10] のaそのもののアドレス(&a)は取れるようなもんじゃないっしょっていう。
0579デフォルトの名無しさん2015/01/20(火) 14:29:31.86ID:KvM0UR0/
>>577
アドレスが取れないと判断した理由は?

template<typename T> struct X;
int main() {
 int a1[100];
 X<decltype(&a1)> dummy;
}
0580デフォルトの名無しさん2015/01/20(火) 17:56:40.12ID:aVZQpFMF
教えてください。

MessagePack RPC for C++でwindowsで動くもの(UDPも)を知ってる方いますか?
探してるんですが、それっぽい物を落としてVCでビルドしてみたり、
Cygwinでビルドしてみたり色々やっているんですが、UDPを送受信できるもので、
それらしいものが見当たりません。

知ってる方がいらっしゅいましたらURLを教えてください。
0581デフォルトの名無しさん2015/01/20(火) 19:00:57.56ID:lX6RmyQp
idlのendpoint変更するだけじゃねーの
0582デフォルトの名無しさん2015/01/20(火) 19:01:36.10ID:lX6RmyQp
つかスレチ
0583デフォルトの名無しさん2015/01/20(火) 19:53:54.71ID:YD3reShv
aは左辺値だと思うけど
というか配列型って左辺値になるの?
0584デフォルトの名無しさん2015/01/20(火) 20:27:11.19ID:cuVWHT+g
>>554
4.8.3もダメだったので諦めてvs使います
ありがとうございました
0585デフォルトの名無しさん2015/01/20(火) 20:50:59.07ID:cuVWHT+g
なんかパッチがでてたのであてたら使えるようになりました
http://stackoverflow.com/questions/12975341/to-string-is-not-a-member-of-std-says-so-g
0586デフォルトの名無しさん2015/01/21(水) 21:48:08.89ID:C2GgMmPA
日本規格協会でISO/IEC 14882:2015が販売開始されたな
おまいらの会社はこういうの買ってくれるの?
0587デフォルトの名無しさん2015/01/21(水) 22:55:28.65ID:0pZDWm7E
頼むからC++11使わせてくれって行ったらrhel6のデフォルトの環境がgcc4.4だから駄目って言われた
0588デフォルトの名無しさん2015/01/21(水) 22:56:02.68ID:8VLGtKQr
>>585
MinGWのバグとかテキトーな議論になってるな。
cygwinで入れれるx86_64-w64-mingw32-g++は4.8.3で問題なく動くってのに。
c++config.hってどうせconfigureしたらできるヘッダだから、その時のC99機能みおとしなだけだが。
インライン関数だしc++config.hイジるだけで使えると思う。
0589デフォルトの名無しさん2015/01/21(水) 23:10:02.61ID:EXEjsO33
C++11一度使ったらC++03とか使う気しないもんなー
0590デフォルトの名無しさん2015/01/22(木) 07:32:47.90ID:TKjQWfO9
#include <iostream>
#include<sstream>
using namespace std;

int main() {
stringstream s;
s<<'a';
s.ignore(1);
cout<<s.eof()<<endl;
s.ignore(1);
cout<<s.eof()<<endl;
s.clear(ios::eofbit);
cout<<s.eof()<<endl;
// your code goes here
return 0;
}
出力
0
1
1

このコードで2つ質問します
sのサイズが1なのに2回ignoreしないとeofフラグが付きません
ファイルストリームの場合はファイルサイズが1のとき1回ignoreするとeofフラグが付きました
s.clear(ios::eofbit)をしたのにeofフラグがクリアーされません
教えてください
0591デフォルトの名無しさん2015/01/22(木) 08:13:30.99ID:oI9MVddq
ios::clear()は、「引数に渡されたフラグをクリアする」じゃなくて、「引数に渡されたフラグを設定して、それ以外をクリアする」だから、そのコードだとeofフラグはクリアされない
eofフラグがセットされるのはeofを超えて読み込もうとした時だから、むしろファイルサイズが1でも1文字ignoreしただけならeofフラグは付かないはずだけど
0592デフォルトの名無しさん2015/01/22(木) 08:38:20.73ID:TKjQWfO9
googleでC++で検索して4番目にみつかる
http://www.cppll.jp/cppreference/cppio_details.html
には指定したフラグをクリアーすると書いてありますけど
そして
#include <iostream>
#include <fstream>
using namespace std;

int main() {
fstream f{"aaa",ios::in|ios::out|ios::trunc};
f.put(1);
f.put(1);
f.seekp(0,ios::beg);
f.ignore(2);
cout<<f.eof()<<endl;

return 0;
}
出力
1
これはなぜなんですか?
0593デフォルトの名無しさん2015/01/22(木) 09:37:03.15ID:QfKlzsaM
ヌル終端文字列と、非ヌル終端文字列をコンパイル時に区別するには、
どのように型定義をすれば良いでしょうか?

クラスであれば boost::basic_string_ref から null_terminated_ref を派生して
型の差を表現できたのですが、配列を指すポインタでも強い型付けをしたいのです。
0594デフォルトの名無しさん2015/01/22(木) 09:40:23.01ID:m3Bf/Hej
非ヌル終端文字列ってどういうときに使うのん
0595デフォルトの名無しさん2015/01/22(木) 10:10:37.91ID:QfKlzsaM
>>594
長さ (int か size_t) とセットで扱うケースです。

const NonTerminatedCharSeq seq;
size_t len;
getStringBuffer(&seq, &len);
requireNonTermAndLen(seq, len); // ← OK
requireTerminatedString(seq); // ← NG: これをエラーにしたい
0596デフォルトの名無しさん2015/01/22(木) 11:29:36.55ID:qwgPojtQ
使いどころがよく変わらないけど
throwしたら?
0597デフォルトの名無しさん2015/01/22(木) 11:39:27.71ID:QfKlzsaM
>>595 の NonTerminatedCharSeq は 非const でした。 const CharType* のつもりでした。

>>596
末尾が分からないので、throw 前に、ヌル終端を確認する段階で segfault で落ちると思います。
0598デフォルトの名無しさん2015/01/22(木) 11:54:09.90ID:ks/7g+OJ
>>597
問答無用でthrowすれば確認する必要ないじゃないのよ
0599デフォルトの名無しさん2015/01/22(木) 12:01:19.12ID:ks/7g+OJ
ideoneにでも貼ってみたら?
オレオレされてもどのように定義されてるのか分からないので
エスパーするにも限度があるよ
0600デフォルトの名無しさん2015/01/22(木) 12:09:57.68ID:m3Bf/Hej
配列はある型のオブジェクトを線形に集めたものって性質しか持てないんだから
型に同じcharを使う限りヌル終端だの非ヌル終端だのを区別するのは無理じゃね?
0601デフォルトの名無しさん2015/01/22(木) 12:34:43.11ID:QfKlzsaM
>>600
そうですね。 スマートポインタ的な型を噛ませることにします。

>>598
コンパイル時に区別する話に throw が出てくるのはナンセンスです。
0602デフォルトの名無しさん2015/01/22(木) 12:34:43.39ID:lh8u5jbd
std::string s;
s.assign(buffer,buffer+len);
これでええやん
0603デフォルトの名無しさん2015/01/22(木) 12:39:13.96ID:lh8u5jbd
>>601
分けること自体ナンセンスだと思うんだけど何がしたいの?
0604デフォルトの名無しさん2015/01/22(木) 12:50:57.01ID:m3Bf/Hej
'\0'が終端じゃない('\0'は無意味記号としてスルーするような仕様の)文字列も実際あるし
ぎりぎりまで最適化されたパーサ作るときなんかも両者が混在するケースはなくはないかもよ
分けることがナンセンスかどうかは判断つかぬ。
0605デフォルトの名無しさん2015/01/22(木) 13:01:13.47ID:ks/7g+OJ
>>601
それなら
requireTerminatedString(seq); // ← NG: これをエラーにしたい
これを定義しなきゃいいじゃないの
0606デフォルトの名無しさん2015/01/22(木) 13:21:39.79ID:ks/7g+OJ
> '\0'が終端じゃない('\0'は無意味記号としてスルーするような仕様の)文字列も実際あるし
ほんまかいや
L'\0'ってオチでは?
0607デフォルトの名無しさん2015/01/22(木) 13:26:19.67ID:m3Bf/Hej
>>606
地デジの8単位符号とか
0608デフォルトの名無しさん2015/01/22(木) 13:31:20.39ID:TKjQWfO9
#include <iostream>
#include<sstream>
using namespace std;

int main() {
stringstream s;
s.put('a');
s.put('b');
s.ignore(1);
cout<<s.tellg()<<s.eof()<<s.fail()<<endl;
s.ignore(1);
cout<<s.tellg()<<s.eof()<<s.fail()<<endl;
s.ignore(1);
cout<<s.tellg()<<s.eof()<<s.fail()<<endl;
return 0;
}
100
200
-110
これはふつうじゃないですか。
0609デフォルトの名無しさん2015/01/22(木) 13:32:21.67ID:TKjQWfO9
#include <iostream>
#include<sstream>
using namespace std;

int main() {
stringstream s;
s.put('a');
s.put('b');
s.ignore(2);
cout<<s.tellg()<<s.eof()<<s.fail()<<endl;
return 0;
}
-110
これはなぜですか?
0610デフォルトの名無しさん2015/01/22(木) 13:36:23.92ID:lh8u5jbd
>>607
そんなんparserで読める形にして返すべき
仕様を知らないと使えないような糞parser作るなよ
0611デフォルトの名無しさん2015/01/22(木) 13:48:18.82ID:TKjQWfO9
istream& ignore (streamsize n = 1, int delim = EOF);
Extracts characters from the input sequence and discards them,
until either n characters have been extracted, or one compares equal to delim.
キャラクターを取り出して捨てる
n文字を取り出されるまで あるいは 取り出された文字の中の文字がEOFと一致するまで

じゃないですか
上の例だとaとbの2文字を取り出す aとbの文字の中にEOFは含まれないから
2文字読み捨てるだけのはずなんですよ
0612デフォルトの名無しさん2015/01/22(木) 14:03:41.07ID:TKjQWfO9
#include <iostream>
#include<sstream>
using namespace std;

int main() {
stringstream s;
s.put('a');
s.put('b');
s.ignore(2);
cout<<s.tellg()<<s.eof()<<s.fail()<<endl;
s.clear();
cout<<s.tellg()<<s.eof()<<s.fail()<<endl;
return 0;
}
-110
200
なぜかクリアーすると正常にもどりますが
0613デフォルトの名無しさん2015/01/22(木) 15:27:00.20ID:KXkPACSP
>>612
gccのバグっぽいね。clangだと正常
0614デフォルトの名無しさん2015/01/22(木) 16:21:05.14ID:TKjQWfO9
一応clangですが
もしかしてライブラリーもclangに出来るですか?
0615デフォルトの名無しさん2015/01/22(木) 16:22:06.07ID:TKjQWfO9
ideonだとc++4.3.2だけ正常に動きますね
0616デフォルトの名無しさん2015/01/22(木) 16:41:45.61ID:KCvkCnbb
やっぱりc++4.3.2は位置はあってるけどeofフラグはあってませんね
codepadも同じでした
0617デフォルトの名無しさん2015/01/22(木) 17:18:44.66ID:KXkPACSP
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42857
0618デフォルトの名無しさん2015/01/22(木) 18:55:32.00ID:WdOYbvBg
ありがとうございます
ignoreはバグで使えないことがわかったので
seekpを使うことにします
0619デフォルトの名無しさん2015/01/23(金) 07:11:35.45ID:2AoMrA3W
スペシャルメンバー関数はコードの中で使わなければ
自動生成されないのですか?
0620デフォルトの名無しさん2015/01/23(金) 07:34:45.99ID:xxltq5Yq
glibのワイドキャラ版はバギー過ぎ
0621デフォルトの名無しさん2015/01/23(金) 08:10:15.96ID:2AoMrA3W
deprecateとはいまは使えるけれど
そのうちC++でつかえなくなるということですか?
0622デフォルトの名無しさん2015/01/23(金) 09:52:38.55ID:Mcjm1ThG
iostream系って使ってるやついるの?
メッセージのローカライズを考えたら最悪の設計だろ?
バイナリデータの入出力には大げさすぎるし
0623デフォルトの名無しさん2015/01/23(金) 11:01:12.37ID:VC3FF7ui
>>622
バイナリデータに使ってる。
localeが糞なのであってiostream自体はそれ程問題ないと思うけど
0624デフォルトの名無しさん2015/01/23(金) 11:06:23.24ID:9vqKWjl6
気にするな
ハゲが進むぞ
0625デフォルトの名無しさん2015/01/23(金) 13:08:03.97ID:Mcjm1ThG
>>623
localeはiostream以外の全てに絡むから、ちょっと置いておきたいが、
置換ではなく、連結で書式化するのが問題だと言いたかったんだ

単純な英日ローカライズでも
stringstream << I << _(" have ") << pens;
だとつらくないか?
sprintf(str, _("%s have %s"), I, pens);
ならまだ最後の %s の後に文字列を補う余地があるが
0626デフォルトの名無しさん2015/01/23(金) 13:30:21.20ID:iNkbBRr1
ちょっと意味がよくわからない
0627デフォルトの名無しさん2015/01/23(金) 14:06:31.12ID:CKWB/WqA
>>625
上がダメで下がOKな理由が解らん。

でもstream演算子とそれを使った書式指定は確かに使いづらいからあんまり使ってない。
マニュピレーターまで行くと出力方法を再設定するまでずっと変化させるのが個人的に受け付けないから絶対使わない。
ss <<std::hex(123)<<std::endl;
こんな感じで指定できて内部状態変えなかったらまだマシな感じがするんだが

思い返すと結構不満あるけど不満があるところ全く使ってないな。
0628デフォルトの名無しさん2015/01/23(金) 14:24:22.42ID:Mcjm1ThG
>>627
某ゲームで「へ <地名>」という謎の日本語訳を見て、
cout << localize("To ") << localize("Skyrim");
printf(localize("To %s"), localize("Skyrim"));
の場合、後者ならまだ "To %s" → "%s へ" という語順の入れ替えもできるのになと思ったんだ。

もちろん、ちゃんとやろうとすると、複数形やら男女性名詞やらも入ってくるから
もっと複雑な仕組みを使っているんだろうが、シンプルなケースでもCよりも退化している気がしてな。
0629デフォルトの名無しさん2015/01/23(金) 15:01:12.34ID:CKWB/WqA
>>628
sk○rimの事かー!

その辺ちゃんとやろうと思ったら他言語とかunix仕様のprintfみたいな引数の番号指定できるようなもの作るしかないよな
0630デフォルトの名無しさん2015/01/23(金) 15:20:05.29ID:+4s/SmeM
日本語→英語の場合
1人→one hage
2人→two hages
%d人→%s hage%s
とかやり始めたら地獄 (実際はもう少し複雑)
0631デフォルトの名無しさん2015/01/23(金) 17:19:12.03ID:2AoMrA3W
cout << localize("Skyrim")<< localize("To ") ;
入れ替えられますが
0632デフォルトの名無しさん2015/01/23(金) 18:20:03.26ID:iNkbBRr1
>>631
文字列リテラルだけ弄ることをローカライズと呼ぶっぽいよ

まあコード全体を把握せずにロジックまで変えるのは危ないっちゃあ危ないけど、
printfのフォーマット文字列部まで弄るのはそれはそれでかなりリスキーだよね
0633デフォルトの名無しさん2015/01/23(金) 20:22:00.05ID:hXVAGJ+L
class CManiac {
public:
int operator+() {
return 2;
}
};

int main() {
CManiac maniac;
int iValue = +maniac;
printf("iValue = %d\n", iValue); // 答えは 2 になります。
return 0;
}


ベクトルの計算で使われるoperatorは何とか使い方わかったのですが、上記のオペレータの
使い方がわかりません・・・

int iValue = +maniac;

とありますが、なぜ左辺なしでいいのか、+の右辺は引数じゃないのか・・・
馬鹿な私にもわかるように教えてください・・・
0634デフォルトの名無しさん2015/01/23(金) 20:23:30.39ID:B6TLxfZL
+0とかあるだろ
0635デフォルトの名無しさん2015/01/23(金) 20:48:15.94ID:+4s/SmeM
>>633
+と-には単項演算子(unary operator)の役割もあるからだ
https://en.wikipedia.org/wiki/Unary_operation
0636デフォルトの名無しさん2015/01/23(金) 20:54:56.31ID:k2EHLgKo
>>633
C 演算子
ttp://ja.wikipedia.org/wiki/C%E3%81%A8C%2B%2B%E3%81%AE%E6%BC%94%E7%AE%97%E5%AD%90#.E7.AE.97.E8.A1.93.E6.BC.94.E7.AE.97.E5.AD.90
+は単項演算子と二項演算子と二つあるんですよ。
その単項演算子を書き換えただけ。

演算子オーバーロードは好き勝手な機能を作ってよい。
引き算したりかけ算したりでも結構。
だけど、見た目の意味と反する機能を載せると混乱するからやめませう。

まあ普通の関数でも、
void oppaigazou()
みたいな関数を実行して、
ようこそバーボンハウスへ
とか表示されても困るっしょ。
0637デフォルトの名無しさん2015/01/23(金) 21:06:23.38ID:hXVAGJ+L
>>634-636
おおおoperator 単項演算子でググったらわかりました! ありがとうございます。
単項演算子にもなるんですね。というか単項演算子の意味がよく分かってませんでした。感謝です。
0638デフォルトの名無しさん2015/01/24(土) 05:15:10.98ID:nRHL+kQx
+1とか-1とかに使う符号を変数の前に書く話?
0639デフォルトの名無しさん2015/01/24(土) 18:16:20.54ID:pTbu8ydo
三項演算子ってなんでオーバーロードできないの?
0640デフォルトの名無しさん2015/01/24(土) 18:49:21.39ID:6Ll+V+b6
短絡評価出来ないから。
でも&&,||がオーバーロード出来るのはバカが規格作ったとしか言いようが無い。
0641デフォルトの名無しさん2015/01/24(土) 22:29:23.89ID:uB8Zp40F
>>640
出来るの?
どう解釈されるんだよ。
標準の演算子は左側の結果次第で右側処理しないのに。
オーバーロードしたら右側は演算子関数の引数として評価されたものが渡されちゃうじゃん。
0642デフォルトの名無しさん2015/01/24(土) 22:51:38.43ID:b+FSusAQ
まあ、Dみたいにやろうと思えば出来るよね。
特に今はlambdaも有るから、どう解釈されるかも分かりやすいだろう。
0643デフォルトの名無しさん2015/01/24(土) 23:32:54.36ID:6Ll+V+b6
>>641
オーバーロードしたものは動作が異なる
短絡評価はしない
0644デフォルトの名無しさん2015/01/24(土) 23:37:22.52ID:pTbu8ydo
>>643
なんだそれは…役に立つ見込みがないな
deprecatedしちゃえばいいのに
0645デフォルトの名無しさん2015/01/24(土) 23:49:54.77ID:uB8Zp40F
>>643
バグの元だな。
0646デフォルトの名無しさん2015/01/24(土) 23:53:06.74ID:fkphD0bY
コンパイラを作る上で文法上の制約が無いことと
言語の意味的に問題があるかの区別がつかないハゲが
考えた糞言語だからね
06475052015/01/25(日) 02:39:31.72ID:jonHqlx4
お話中すみません
libtool: error: can't build x86_64-w64-mingw32 shared library unless -no-undefined is specified
ってどういう意味でしょう?
0648デフォルトの名無しさん2015/01/25(日) 02:47:56.64ID:jonHqlx4
-rpathの前に-no-undefinedをつけたらlink通りました
0649デフォルトの名無しさん2015/01/25(日) 10:22:42.68ID:ETJbvR7U
テンプレート引数で値を受け取る場合に、文字列リテラルと文字列配列を区別する方法はありますか?
template < size_t N > void foo(const char (&s)[N])
とすれば文字列へのポインタと配列を区別することはできたのですが、リテラルと区別する方法が欲しいです。
0650デフォルトの名無しさん2015/01/25(日) 11:08:29.46ID:VvVj4cWm
const char s1[] = "abc"; としたとき
foo(s1);
foo("abc");
を区別したいってことだったらちょっと思い浮かばない。
0651デフォルトの名無しさん2015/01/25(日) 11:25:45.65ID:4oCs0q67
SFINAEでタグデスパッチングすればいいんだよ
0652デフォルトの名無しさん2015/01/25(日) 11:27:10.73ID:GkPu8jFa
文字列リテラルって、本来的な定義的では const char* const じゃないの?
つまり、 void foo(const char*) に文字列リテラルを渡せるという仕様がおかしいんだよ!
0653デフォルトの名無しさん2015/01/25(日) 11:32:21.21ID:4Wfo0lBB
なにがおかしいんだ?
void foo(char*)に渡せるのはおかしいと思うけど
0654デフォルトの名無しさん2015/01/25(日) 11:58:44.67ID:VvVj4cWm
>>651
どういう意味?
0655デフォルトの名無しさん2015/01/25(日) 12:11:01.00ID:kIxCnLDS
>>652
>文字列リテラルって、本来的な定義的では const char* const じゃないの?
違うよ。どこが違うか20字以内で回答せよ。
0656デフォルトの名無しさん2015/01/25(日) 12:24:13.51ID:ETJbvR7U
>>650
直接リテラルを指定した場合のみを区別したいです。 foo("abc")

マクロを使えば、リテラルの連結を利用して使い方のミスだけは回避できる、
#define foo(literal) foo_impl("" literal)
という方法があるようなのですが、テンプレートとオーバーロードでできないでしょうか?
0657デフォルトの名無しさん2015/01/25(日) 13:36:49.08ID:6175FHBn
>>655
すっこんでろホゲ荒らしめ
あとちゃんとクソコテつけろ
0658デフォルトの名無しさん2015/01/25(日) 14:13:16.81ID:4V3JyQfq
>>656
文字列リテラルは配列なのでプリプロセス後は区別が不可能。
配列変数 const char ar1[5] の場合
 型:const char [5]
 プライマリ式(ID式)の分類:lvalue
文字列リテラル "abcd" の場合
 型:const char [5]
 プライマリ式(リテラル)の分類:lvalue
型もvalue categoryも両方同じなので、オーバーロードも部分特殊化も使えない。
ノンタイプテンプレートパラメーターにはリテラルが使えないので
SFINAEで何とかならないかとも考えたけど思いつかず
0659デフォルトの名無しさん2015/01/25(日) 14:47:27.34ID:ETJbvR7U
>>658
ありがとうございます。 難しそうですね。
もしかするとconstexprで何かできるかもしれないので、対応したコンパイラが手に入ったらまた試してみます。
0660デフォルトの名無しさん2015/01/25(日) 15:15:44.96ID:WsD7AEIl
静的解析するしかないんじゃないの
0661デフォルトの名無しさん2015/01/25(日) 15:34:50.83ID:VvVj4cWm
>>659
目的を教えて。
それによって全然違う方向性もありえるし。
0662デフォルトの名無しさん2015/01/25(日) 16:12:10.04ID:ETJbvR7U
>>661
元々の目的は「プログラム終了まで寿命を持っており、変更されない文字列だけを特別扱いしたい」ということでした。
リテラルなら十分条件だと思ったのですが、もし別の方向で実現可能ならば全く問題ないです。
ただ、「それ専用の名前」を関数やマクロにつけるのではなく、
他の文字列用の関数との使い分けを意識せずにオーバーロードさせたいです。
0663デフォルトの名無しさん2015/01/25(日) 16:34:05.07ID:WsD7AEIl
>>662
> 元々の目的は「プログラム終了まで寿命を持っており、変更されない文字列だけを特別扱いしたい」ということでした
元々の目的は ? であり、その手段として
プログラム終了まで寿命を持っており、変更されない文字列だけを特別扱いする必要性が生じた
って事でしょ?
手段が目的化してる
0664デフォルトの名無しさん2015/01/25(日) 17:04:10.83ID:JtbeKPv3
配列だからとか関係なく、
const intでもintでも
を
func(int), func(const int)
どっちに渡してもいいだろ。
参照やアドレスを渡すならともかく、値を渡すだけなんだから。
文字列リテラルも一緒。
0665デフォルトの名無しさん2015/01/25(日) 17:06:10.90ID:q//XhoOI
寿命のはっきりしないものを保持するなよ
コピーしてもっとけ
0666デフォルトの名無しさん2015/01/25(日) 17:13:30.59ID:tn73IjQ8
標準ライブラリ、STLからビルドして、コンパイラ格差を無くしたいんだけど。
VCでビルド化でlinux用のソースコードが動く率が高い組み合わせはどれですか?
0667デフォルトの名無しさん2015/01/25(日) 17:43:26.11ID:WsD7AEIl
>>666
おちついて
0668デフォルトの名無しさん2015/01/25(日) 18:05:45.40ID:tn73IjQ8
visual C++で標準ライブラリ、STLからビルドして、
コンパイラ格差を減らしlinux向けのソースコードがコンパイルできるようにしたいですが
どの標準ライブラリ、STLの実装がいいですか?
特にGCC専用のC言語拡張命令が多いといいです。
0669デフォルトの名無しさん2015/01/25(日) 18:13:48.96ID:pVReJ80Y
日本語で
0670デフォルトの名無しさん2015/01/25(日) 18:40:12.27ID:gAd5OZDm
ライブラリの話かと思ったら急にコンパイラの話に変わるような
0671デフォルトの名無しさん2015/01/25(日) 18:47:20.67ID:/0qLCOtg
Windowsでそのまま動くGCC使ってみたら?
0672デフォルトの名無しさん2015/01/25(日) 19:03:32.79ID:tn73IjQ8
MinGWでも、たとえばSocket通信は標準のlinuxで動作するやつが入ってないです。
標準ライブラリはこういうやつですが、コンパイルに同包されてるやつよりlinux寄りになる期待ができます。
ビルド可能か、と何が内蔵されてるかに差はあるんですが。


glibc
dietlibc
musl
uClibc
Newlib
Gnulib
0673デフォルトの名無しさん2015/01/25(日) 19:11:45.72ID:tn73IjQ8
たとえば、これはwindowsのVisual C++ではビルド不可ですよね?
Visual C++でビルドできて、LinuxのGCCコンパイラの命令(インクルードファイル)が使えるやつを探してます。




musl - Wikipedia

最新版 1.1.6 / 2015年1月13日
対応OS Linux 2.6以降
プラットフォーム x86, x86-64, ARM, MIPS, MicroBlaze, PowerPC

muslは MIT Licenseでリリースされている Linux の標準Cライブラリ。
クリーンで、効率的で、標準に準拠した標準Cライブラリの実装を目標としている。
1から設計されており、アプリケーションを単一のポータブルなバイナリファイルとして配布できるように静的リンクに最適化している。
POSIX:2008 と C99 準拠であるとしている。Linux, BSD, glibc の非標準な関数も実装されている。
0674デフォルトの名無しさん2015/01/25(日) 19:15:59.93ID:WsD7AEIl
わざとやってるだろ
0675デフォルトの名無しさん2015/01/25(日) 19:37:21.56ID:tn73IjQ8
Wineを、windowsのVC++でビルド可能な標準ライブラリってありますか?どうやっても無理ですか?
linuxの標準命令・関数で実装されていたらできると思うんですが。



Wine - Wikipedia
Wineは、オープンソースの Windows API 実装を通じて、Unix系OSにおいてWindows用アプリケーションをネイティブ動作させることを目標とするプログラム群である。
エミュレータと異なり、Wineは基本的にはCPUエミュレーションを行っていない。アプリケーションによってはWindows上より高速に動作することもあるという。
Wineに含まれるWindows API実装はWinelibと呼ばれ、これを用いてWindowsプログラムのソースコードからプラットフォームネイティブなバイナリをビルドすることも可能である。
0676デフォルトの名無しさん2015/01/25(日) 21:39:07.93ID:q//XhoOI
linux向けの標準ライブラリをVCでコンパイルしたいってことか?
無理じゃね
0677デフォルトの名無しさん2015/01/25(日) 22:02:04.94ID:3yf8YM/m
Windows とLinux ではバイナリのフォーマットも違うから関数を呼ぶ以前の段階で動かない。
0678デフォルトの名無しさん2015/01/25(日) 22:03:51.60ID:VvVj4cWm
ソースコートの互換性の話かと思ってたがまさかクロスコンパイル?
0679デフォルトの名無しさん2015/01/25(日) 22:13:58.66ID:u5v7I2U8
ああ、どういう意味があるのかわからんが、
もしかしてwine をVC でビルドしてWindows で動かしたいわけかな?
0680デフォルトの名無しさん2015/01/25(日) 22:16:37.41ID:iRaJjyt2
なにそのカニの脚にカニカマ詰めてみた的な行為
0681デフォルトの名無しさん2015/01/25(日) 22:18:45.24ID:VvVj4cWm
ソースコートって何だよ
0682デフォルトの名無しさん2015/01/25(日) 22:21:28.89ID:iRaJjyt2
ソースしか売ってないフードコート的なもの
客はカニカマを持ち込んで思い思いのソースを掛けて食べる
0683デフォルトの名無しさん2015/01/25(日) 22:49:30.53ID:oqd1KBB3
ソースって、ブルドッグとかの?
コートって、ショッピングモールにあるフードコートか
0684デフォルトの名無しさん2015/01/25(日) 23:00:22.59ID:HJERafoR
mingwやcygwinで足りないなら自分で作れ

もっといいのがあったらそっちがメジャーになっているだろうに
0685デフォルトの名無しさん2015/01/25(日) 23:16:49.63ID:MwbE0lEm
>>682
ソースバイキングならホテルのレストランで見かけたことがある
ソースが何種類もあって客は小皿に取り分けてくというw

ライスがパッサパサでフードコート以下だったな
ソースばかりに気をとられて基本が疎かになってるのは良くない
0686デフォルトの名無しさん2015/01/26(月) 00:11:10.54ID:EVnleu0D
類似機能で違う関数ならラッパー書いて条件コンパイルでもしろよ
0687デフォルトの名無しさん2015/01/27(火) 06:06:23.73ID:CbndgpqM
C++とLispはどっちがきもいですか?
0688デフォルトの名無しさん2015/01/27(火) 06:25:35.31ID:NrHYAzh7
煽る>>687がキモイ
0689デフォルトの名無しさん2015/01/27(火) 06:44:30.81ID:CbndgpqM
>>688
(*^_^*)
0690デフォルトの名無しさん2015/01/27(火) 07:22:45.70ID:bJWDyyzE
>>689
やっぱり変わってるなLisp
正規表現か何か?
0691デフォルトの名無しさん2015/01/27(火) 14:22:59.84ID:gMYysETi
((((*^_^*))))
0692デフォルトの名無しさん2015/01/27(火) 16:57:52.40ID:bJWDyyzE
ネストしすぎぃ!
0693デフォルトの名無しさん2015/01/27(火) 19:17:52.66ID:tavqsaWy
<<<<*`∀´*> > > >
「いい加減右アングルブラケットにスペース入れるのやめて下さい先輩」
0694デフォルトの名無しさん2015/01/27(火) 20:56:43.30ID:ijcuALOq
>>693
C++03なら仕方ないだろ
それともC++11以外存在も認めないのか
0695デフォルトの名無しさん2015/01/27(火) 21:37:13.16ID:eg3NzOKG
>>693はC++11が使える職場での会話と考えられる
>>694は会話のできないアスペ
0696デフォルトの名無しさん2015/01/27(火) 21:47:30.63ID:KRe6og0K
ほんのちょっとだけ見た目を良くするために利用可能なツールの幅を狭めるのよくない
0697デフォルトの名無しさん2015/01/27(火) 22:15:44.53ID:H3vCWtkz
どうせその一点だけ後方互換保ったとしても、完全互換のヘッダを書くためには#if __cplusplus >= 201103Lを大量に書くことになるから、ライブラリ開発者でもなくてC++11使うと決めたならそんなこと気にしなくてよい
0698デフォルトの名無しさん2015/01/27(火) 22:34:14.31ID:RrImLxtB
正直そんな細かい所どうでもええですわ
0699デフォルトの名無しさん2015/01/28(水) 17:12:05.44ID:bV4yRAzc
foreachが地味に配列を食えるようになっていた。驚き。
ttps://paiza.io/projects/jCGMw6888hiwBbXRfJm7NQ
あと、これ以外の方法でforeachで配列逆からなめる方法無いですか?
0700デフォルトの名無しさん2015/01/28(水) 17:35:48.62ID:bV4yRAzc
あれ?俺なんかすんごい勘違いしてる?
0701デフォルトの名無しさん2015/01/28(水) 17:45:56.59ID:8qkuY6PV
range based forが配列受け取れるのは元から
0702デフォルトの名無しさん2015/01/28(水) 17:48:52.76ID:UK1aUFc0
コンパイラのオプション0xまで戻したけど通るね
0703デフォルトの名無しさん2015/01/28(水) 17:59:15.94ID:bV4yRAzc
昔VCで試した時ダメだった気がしたのでそのイメージで語ってたわ。
で、逆からなめるスマートな方法ってない?foreachで。
0704デフォルトの名無しさん2015/01/28(水) 22:44:08.65ID:anpOJbJr
十分スマートじゃないか? Make_Range_Reveaseで何か不満あるのか?
0705デフォルトの名無しさん2015/01/28(水) 22:52:02.75ID:tVdW+eQ4
Boost.Range? 褒めて欲しいのでは
0706デフォルトの名無しさん2015/01/28(水) 23:18:34.92ID:bV4yRAzc
いやー、最近触ってないから、リバースドレンジベースフォーとか入ってたらどうしようかと思ったんだ。
これが最適なら安心だ。ご意見ありがとう。
0707デフォルトの名無しさん2015/01/28(水) 23:59:08.46ID:P4n3EC8x
boost::adaptors::reverse
0708デフォルトの名無しさん2015/01/29(木) 00:02:38.77ID:0Sn1bNfj
Boostに有るのね。フムフム。
0709デフォルトの名無しさん2015/01/29(木) 17:46:17.16ID:NaBCaSZN
りばぁすあいてれぇたぁ
0710デフォルトの名無しさん2015/01/29(木) 18:49:06.99ID:0Sn1bNfj
リバースイテレータを食べるれんじべーすどふぉーが無いの。グスン。
0711デフォルトの名無しさん2015/01/29(木) 21:15:53.29ID:pKGFftLs
マクロを使おう(錯乱
https://paiza.io/projects/gJ3slfe6OcXTnQpP1wIPzg
0712デフォルトの名無しさん2015/01/29(木) 21:50:07.72ID:EJcHYbw8
コンパイルエラー出てんぞ
0713デフォルトの名無しさん2015/01/29(木) 21:53:45.85ID:pKGFftLs
>>712
エラー出して遊んでて忘れてた
0714デフォルトの名無しさん2015/01/30(金) 23:05:17.71ID:4sRq6VBs
inline void hoge(){}
をヘッダに書くのは未定義動作になるんですか?
0715デフォルトの名無しさん2015/01/30(金) 23:06:57.58ID:izyMlQ+2
ああ、間違いなく未定義さ。
0716デフォルトの名無しさん2015/01/31(土) 06:49:29.15ID:QojJdjq0
ちょっと何言ってるかわからない
0717デフォルトの名無しさん2015/01/31(土) 08:14:46.14ID:twuLHPdy
あるふたつのクラスA、Bが、同じ型・同じ数の引数をとるコンストラクタを持っているとします
いま、A、Bいずれかの名前が入っていると期待される文字列に応じて
Aの名前が入っていたらAをnew
Bの名前が入っていたらBをnew
と動的に切り替えることはできますか?
0718デフォルトの名無しさん2015/01/31(土) 08:31:30.99ID:twuLHPdy
すみません>>717に追記なんですが
切り替えるコードでは、クラスA、クラスBは未知とします。
例えば、切り替えるクラスの型だけ文字列を比較して分岐するということはしないということです。
ようするにObjective-CのNSCodingのようなことをやりたいのです。
ポインタ(正確にはshared_ptr)で参照するオブジェクトを、型情報を保ったままディスクに保存し、
元の型として復元したいのです。
0719デフォルトの名無しさん2015/01/31(土) 08:39:32.96ID:22jr/cuQ
日本語でおk
0720デフォルトの名無しさん2015/01/31(土) 08:48:10.90ID:sjGzdXck
>>717
文字列を比較して一致したクラスをnewして返せばいいじゃん。
if文の羅列
0721デフォルトの名無しさん2015/01/31(土) 09:21:35.44ID:QYjeED09
>>718
真に定義が未知なクラスのインスタンスは作れんだろう。
NSCodingだってそれぞれの型のデシリアライズの仕方を知っている人がどっかに存在するわけで、
本質的には「切り替えるクラスの型だけ文字列を比較して分岐」と変わらん。
0722デフォルトの名無しさん2015/01/31(土) 09:27:51.46ID:22jr/cuQ
こいつが言いたいのはこういうことだろう
aからzアルファベットの10文字のクラスを27の10乗個のクラスを
前もって作っておいて文字列と比べるということだろう
0723デフォルトの名無しさん2015/01/31(土) 09:28:08.78ID:3hGQPgsJ
>>718
おそらくあなたの想像しているような処理だけでは「できない」。
少なくとも、その処理をサポートする全てのオブジェクトは同一のクラス/インタフェースから派生し、
さらに「文字列 (ID) → インスタンスをnewして返す関数」のマッピングどこかに持たなければならない。

C/C++で動的にオブジェクトを生成/シリアライズする方法は
MicrosoftがCOM/OLEで20-30年前に通った道だから、
CoCreateInstance なり IPersistStreamInit をキーワードに調べてみるといい。

Objective-C のほうはよく知らないが、どちらかといえば全てのインスタンスが
map<string, any> みたいなものだから、C++のクラスとは本質的に異なると思う。
0724デフォルトの名無しさん2015/01/31(土) 09:45:16.19ID:sjGzdXck
え、未知のクラスを扱いたいのかよ。
そりゃ無理だ。
コンパイル時に定義されていないクラスは生成できないし。
ポリモーフィックに扱うにしても基底クラスはコンパイル時に知っておかないと(コンパイル時に知らない派生クラスを他モジュールからもらって扱うのは可能。ちゃんと派生クラスを知ってるモジュールが静的/動的リンクされてないといけないが)。
0725デフォルトの名無しさん2015/01/31(土) 09:50:16.24ID:22jr/cuQ
頭のおかしい人は無視しましょう
0726デフォルトの名無しさん2015/01/31(土) 09:53:37.26ID:3hGQPgsJ
クラスのコンストラクタが dll/so からエクスポートされていれば、
エクスポート名をdemangleして関数ポインタを得ることはできるかもしれない。
その場合、「コンストラクタの関数ポインタ」という珍しいものを扱うことになるんだろうか。
コンパイラに依存しすぎるし、やりたくは無いな。
0727デフォルトの名無しさん2015/01/31(土) 09:53:39.16ID:oXb68sm+
>>718
コンストラクタじゃ無理だからファクトリー関数を用意して、
クラス名とファクトリー関数のマッピングをどっかに保持して、
そんな感じでやってみたら。

いずれにしろ、
C++ シリアライズ
で検索して既存のコードやコンセプトは理解してから開発着手した方がいい
0728デフォルトの名無しさん2015/01/31(土) 11:07:02.51ID:NVotuPvn
>>724
実行時にソースコンパイルして動的リンクすればいいだけでしょ
>>717 がやりたいことかどうかは知らんけど w
0729デフォルトの名無しさん2015/01/31(土) 12:24:05.64ID:sjGzdXck
どちらにせよ、シリアライズしたいのなら、

名前を見てオブジェクトを生成する関数(dll等になげてもよい)を用意
基底関数にシラアライズ仮想メンバ関数を用意して各派生クラスに実装
名前を基に生成されたオブジェクトのシリアライズ関数を呼ぶ

でいいよ。
コンストラクタにまかせるとデータの仕様を統一しないといけないのでポリモフィックする意味がほとんどなくなる。
0730デフォルトの名無しさん2015/01/31(土) 12:27:55.27ID:F5r8Sgl4
リフレクションの無いC++でコンパイル時に存在しない未知のクラスを扱うには
汚いけど生成クラスを使うのが手かと。
http://ideone.com/4A5E1C
>>729の通りシリアサイザーを仮想にしておけばOK
0731デフォルトの名無しさん2015/01/31(土) 13:17:22.95ID:rnTLCwKc
クラスファクトリーをテーブルに配置してA, B毎に異なるファクトリーを使うのが普通かな、ファクトリーがどんなオブジェクトを作ってくれるのかは未知のままでいいしDLLやSOの向こう側でもいい。
ただしファクトリー関数の実装には当然クラスAやBの素性がわからないと作りようがない。

結局やってることはCOMを使ったプラグイン設計みたいなもんだな。
0732デフォルトの名無しさん2015/01/31(土) 13:22:42.92ID:DdagF+N6
お前ら全員同じこと言ってるの気づいてる?
0733デフォルトの名無しさん2015/01/31(土) 13:26:42.08ID:rnTLCwKc
>>732
気づいてるよ
要するにそういう方法論しかないて事よ
0734デフォルトの名無しさん2015/01/31(土) 14:31:33.63ID:1XVXay7T
集え尻洗いラバーどもよ
0735デフォルトの名無しさん2015/01/31(土) 15:38:38.04ID:shQn+v+X
そんなん型情報見て動的にオブジェクト作れば良いだけちゃうの
違うの
0736デフォルトの名無しさん2015/01/31(土) 15:51:20.30ID:j6V8jxSf
釣りはいいです
0737デフォルトの名無しさん2015/01/31(土) 22:56:04.95ID:tOT84aIP
みなさんありがとうございました。
結局のところ、リフレクションが無いC++では、難しいということなんですね。
共通のインターフェースで、シリアライズするのはともかく、
コンストラクタが、やはり静的に結びついてしまっていますから、
どこかで分岐してコンストラクタを呼び出すとか、そういうことになってしまうんですね。
0738デフォルトの名無しさん2015/01/31(土) 23:02:34.32ID:VoCOaD6K
クラス名を表す文字列を指定するができるのにコンストラクタを選ぶことができない常用が
いまいち想像できない。
0739デフォルトの名無しさん2015/01/31(土) 23:03:02.31ID:VoCOaD6K
×常用
〇状況
0740デフォルトの名無しさん2015/01/31(土) 23:08:02.34ID:DdagF+N6
つーか、リフレクションのある言語ったって、単にコア言語機能に名前とクラスを対応付ける辞書を自動生成する機能があるってだけで、C++だってそういう辞書を自分で作ればいいだけの話だと思うが
0741デフォルトの名無しさん2015/01/31(土) 23:15:31.01ID:Jp7RHa0h
結局それが、皆が言ってるファクトリ関数作れば?という話になるんだよな
0742デフォルトの名無しさん2015/01/31(土) 23:17:34.65ID:scB1FLY/
リフレクションのある言語は俺の名付けた恥ずかしいクラス名をやたらバイナリに埋め込みたがるから手におえない
0743デフォルトの名無しさん2015/01/31(土) 23:17:37.67ID:DdagF+N6
そうだな
俺も同じこと言っちまったww
0744デフォルトの名無しさん2015/01/31(土) 23:21:57.60ID:Jp7RHa0h
>>737
ファクトリ関数という手法は別に例外的な苦肉の策みたいなものじゃなくて、
普通に使われるものだから、こういう時の設計手法として憶えておくといい。
0745デフォルトの名無しさん2015/01/31(土) 23:34:12.95ID:3hGQPgsJ
C++でもコンパイルタイム リフレクションなら採用される余地があるのかな?
スクリプト言語用のバインダで結構欲しいケースがあるんだよな
0746デフォルトの名無しさん2015/01/31(土) 23:35:53.42ID:tOT84aIP
>>740
ですからそれをやると、クラスを追加したり変更したりするたびにその辞書を手作業で更新することになりますよね。
ランタイムがプログラム中のクラスをすべて把握して、動的にクラスオブジェクトを取得したり
そのクラスオブジェクトにメッセージを送信してインスタンスを作成したりできたりするObjective-Cに比べれば
そういう辞書を手作業で作らなきゃいけないのは苦肉の策以外の何物でもないと思いますが、、、
0747デフォルトの名無しさん2015/01/31(土) 23:50:26.91ID:3hGQPgsJ
C++の思想的には「クラスを追加するたびに勝手に辞書に登録されるのは許せない」だと思うがな
動的に作成されるべきクラスと、そうでないクラスがあるはずで、どちらに属するかはコンパイラが判断できるものじゃない
0748デフォルトの名無しさん2015/01/31(土) 23:51:30.76ID:2jhTSE71
>>746
>クラスを追加したり変更したりするたびにその辞書を手作業で更新

>>730のように動的に辞書を作るのでは不満?
どうしてもmain実行前のグローバル変数初期化で使いたいとか
0749デフォルトの名無しさん2015/01/31(土) 23:53:51.94ID:GX7Z3ahN
COMでも使えばいいだろ
0750デフォルトの名無しさん2015/02/01(日) 00:01:34.22ID:3unsKMiE
ドザはこの世の全てのコンピューターがWindowsだと思ってるの?
0751デフォルトの名無しさん2015/02/01(日) 00:11:55.42ID:Elw+oH7f
XPCOMでもいいし他のorbの実装でもいいし、気に入らなければ自分で作ればいい。
C++にそういった機能が用意されてなくても実装は可能だし
元から無いことで不要なメモリ消費等を抑えていることになる。
0752デフォルトの名無しさん2015/02/01(日) 00:25:23.58ID:uqbaW6bG
俺はやりたくないけど多分マクロ一個作れば、クラス定義した後でマクロ使って一行でファクトリメソッドを登録することはできるだろうね。俺はやりたくないけど
ユニットテストフレームワークとかそんな感じでテストケース追加できるようにしてると思う
0753デフォルトの名無しさん2015/02/01(日) 00:30:41.90ID:Drklm6UP
厳密なゼロオーバーヘッドかどうかで議論が起きるくらい
最適化厨だらけのC++でリフレクションなど受け入れられそうにないけどな
0754デフォルトの名無しさん2015/02/01(日) 00:57:57.32ID:plm7tRtI
>>746
太古からあるMFCでさえクラス定義と実装の際にマクロで
簡単にファクトリーのテーブルへの登録を自動化してるよ。
たいていのことには先行事例があるから、無闇に考えず
いくつか例を学習してから考えた方がいいと思う。

あと Objective-C でも alloc はできても init できないから
結局 NSCoder という共通インタフェイスでシリアライズしてるわけで
そこのところだけ取ってみると C++ と大差ない。
0755デフォルトの名無しさん2015/02/01(日) 15:13:40.44ID:+Wu4plDO
結局の話、全てのクラスのメソッドを実装した基底クラスを作り
ファクトリーメソッドで名前により派生クラスをnewをして
全てのクラスを基底クラスで操作すれば
ダックタイピングなんだよな
0756デフォルトの名無しさん2015/02/01(日) 15:34:16.15ID:4FFwxC1H
>>755
まあ結局普通のポリモーフィズムそのものに帰着するんだな
0757デフォルトの名無しさん2015/02/01(日) 21:57:14.71ID:a7daD80f
クラスを継承する場合、実際のところ
多くて何世代くらいですか?
0758デフォルトの名無しさん2015/02/01(日) 21:59:14.31ID:ckgWNtQ3
可変長引数テンプレートのインスタンスだといくらでも増える
0759デフォルトの名無しさん2015/02/02(月) 08:02:23.54ID:VcM6Bw55
>>754
allocできてもinitできないというのはちょっとよくわかりません。
allocとinitはほぼ必ずセットで呼び出すので、initできないなんてことはないと思いますが。
ポリモーフィズムを使ってシリアライズを行うスキームにおいて、
共通インターフェースが必要になるのは当たり前だと思います。
なんでそこが論点になるのかちょっとよくわかりません。
当たり前のことです。java.io.Serializableだってそうです。
問題は、C++では共通インターフェースを定めたところで、コンストラクタをポリモーフィズムにできない、
つまり、NSCodingにおけるinitWithCoder:が、通常の方法では実現できないということだと思います。
0760デフォルトの名無しさん2015/02/02(月) 08:14:10.37ID:JrjmjvyB
日本語でおk
0761デフォルトの名無しさん2015/02/02(月) 08:46:38.92ID:9S8Foh71
もうObj-C使えよ……
0762デフォルトの名無しさん2015/02/02(月) 09:12:31.65ID:k5HPKynx
>>759
- Java における java.io.Serializable
- Objective-C における NSCoding
- C++ (COM) における IPersistXXX 系インタフェース
全部同じ目的のためのものだ。勝手に実装して、勝手に使えよ。

C++では標準ライブラリではなく、MS製だからサポートされないケースが多いってだけ。
まぁ Obj-C もどこまでが標準で、どこからがApple製なのかわからないけど。
0763デフォルトの名無しさん2015/02/02(月) 20:23:24.05ID:YMa8AXvI
それぞれ思想が違う以上、同じ目的でも手段が違うのは仕方ない
それを特定の場合をとって苦肉の策とか
某 kenokabe と同じにおいがする
0764デフォルトの名無しさん2015/02/02(月) 21:42:01.59ID:TDQVyoRL
Apple以外の標準Objective-C
なんて存在するの
0765デフォルトの名無しさん2015/02/02(月) 21:45:58.70ID:BTw9Mjmb
ecmaに採用されてないか検索してみたけど、ECMAScriptが引っかかるなー。
どうやってフィルタリングしようか。
0766デフォルトの名無しさん2015/02/02(月) 22:39:58.39ID:9qb16I9S
そういやObjective-CにはNSで始まるクラス名とか沢山あるから、NextStepが起源だっけ
0767デフォルトの名無しさん2015/02/03(火) 00:06:41.88ID:kePsD8YS
ゴム無し
0768デフォルトの名無しさん2015/02/03(火) 11:57:14.03ID:qMrjKJFk
>>759
君の言ってることは10年も前にファクトリを使うって方法で解決されているので、
コンストラクタがテーブル化できないというのは誰にとっても別に問題じゃないんだ。

「ダイナミックだからって alloc できても init できない」というのは、
CoreFoundation (NextStep 由来のクラス群)の一部のオブジェクトが
シリアライズ・デシリアライズできるのは君が言う

>>746
>ランタイムがプログラム中のクラスをすべて把握して、動的にクラスオブジェクトを取得したり
>そのクラスオブジェクトにメッセージを送信してインスタンスを作成したりできたりする

こととはあまり関係なく、単に NSCoder という共通インタフェイスを
実装しているから仕様の分かってい initWithCoder: で初期化できるからである、
ってこと。そうしてこのパターンはC++でも使われている。

あと、勘違いされないように先に書いておくけど、
君と議論する気少しもないよ。何も得るものもないし。
問われたので説明しただけ。
これで分からないならヤフー知恵袋ででもきいてくれ。
vipでもいいし。
0769デフォルトの名無しさん2015/02/03(火) 12:21:51.01ID:AqPQb7sP
勘違いしないでよね! あんたと議論するつもりなんか無いんだからっ!
0770デフォルトの名無しさん2015/02/06(金) 18:04:57.47ID:R9mupi/W
VisualC++2010でこういう関数呼び出し書いたら警告喰らったんだけど黙らせていいの?

std::vector<int> getList();
void checkList(const std::vector<int>& list);

checkList(getList());→「C4238: 非標準の拡張機能が使用されています : 右辺値のクラスが左辺値に使用されます。」
0771デフォルトの名無しさん2015/02/06(金) 18:19:01.41ID:JzdRSKiT
void checkList ってことは &list を加工するか 非同期処理を含むんだろうからダメじゃね?
0772デフォルトの名無しさん2015/02/06(金) 18:40:13.81ID:QZdLn77T
getListの()いらなくね
0773デフォルトの名無しさん2015/02/06(金) 19:12:15.39ID:eDHY2J9J
関数なんだからないとダメだろ
0774デフォルトの名無しさん2015/02/06(金) 19:23:23.27ID:a7dCLNna
本当に const 参照でそんなウォーニング出るならコンパイラ古すぎだわ
黙らせてokだけどそれ黙らせると非const参照やら
std::vector<int> *p = &getList();
もエラー出なくなりそうだから気をつけろ。
0775デフォルトの名無しさん2015/02/06(金) 19:42:09.00ID:PHMIv/5N
一時オブジェクトの参照はよく怒られるな。
0776デフォルトの名無しさん2015/02/06(金) 21:19:00.39ID:XofOsMKd
const参照で一時変数受け取って怒られるならコンパイラが糞
0777デフォルトの名無しさん2015/02/06(金) 21:20:33.76ID:PNoWHx2c
2012ではそういうワーニング出ないな
バシバシ使ってる
0778デフォルトの名無しさん2015/02/06(金) 21:26:40.50ID:w1qaGmGl
これでエラー出てたらconst std::string& に文字列リテラル渡しただけでワーニング出んじゃね?
VS2010は昔使ったけどそんなワーニング出た覚えないけどなあ
0779デフォルトの名無しさん2015/02/07(土) 07:42:03.87ID:X0JGbSqQ
おまえらホントにレスを文字通りにしか解釈できないのな。
const付け忘れてるんだろ。cppだけ直してヘッダー修正忘れとか。
constでvolatileの付いていない参照型は右辺値を受け取れるので
ソースを見直せとしか言いようがない
0780デフォルトの名無しさん2015/02/07(土) 08:04:14.12ID:2PYtlFBn
>>779
>const付け忘れてるんだろ。cppだけ直してヘッダー修正忘れとか。

それはワーニングじゃ済まないのでは?
0781デフォルトの名無しさん2015/02/07(土) 08:32:42.92ID:7NtuxcOF
2010だったかは忘れたが以前のVCは>>770のケースで警告出てたことは覚えてる
0782デフォルトの名無しさん2015/02/07(土) 09:32:44.93ID:4cqwcWM8
>>779
おれもそう思って一通り調べた上でつけ忘れでは
ないと判断して>>774を書いたよこんにちは低脳www
0783デフォルトの名無しさん2015/02/07(土) 10:40:30.38ID:scHB89CY
VS2010で>>770コンパイルしてみたけどそんな警告なんて出ないなあ
0784デフォルトの名無しさん2015/02/07(土) 10:46:19.56ID:scHB89CY
const付けない場合はC4239になるけどC4238ってどうやったら出るの?
やっぱり何か勘違いしてるんじゃない?
0785デフォルトの名無しさん2015/02/07(土) 13:55:11.99ID:CMxScs3p
こういう人は再現する完全なコードを絶対に出さないので放置
0786デフォルトの名無しさん2015/02/08(日) 00:24:28.42ID:5gL+vLXV
本来は>>774みたいに一時変数のポインタを取ったり間接的に取られたりしたときに出るものらしい
0787デフォルトの名無しさん2015/02/08(日) 12:10:38.91ID:JwkQ/TxR
C++で終了時に勝手にデストラクターが呼ばれてる。呼ばれないように、静的ポインターに動的確保したオブジェクトのポインターを置いてるのに。プレースメントnewしても同じだ。
どうして?
0788デフォルトの名無しさん2015/02/08(日) 12:17:49.18ID:vGudLyzY
さあ
0789デフォルトの名無しさん2015/02/08(日) 12:18:53.44ID:FEtsp/Se
実装依存で普通は呼ばれないが
規格上絶対に呼ばないと言う決まりは無いんじゃないの?

最適化で単なる静的オブジェクトにされているとか。
0790デフォルトの名無しさん2015/02/08(日) 12:30:53.52ID:vGudLyzY
必ずデストラクタが呼ばれるようにマネージされているクラスなんだろどうせ
そんなものデバッガでデストラクタを誰が呼び出してるか見ればすぐ分かること
0791デフォルトの名無しさん2015/02/08(日) 12:41:47.17ID:V4veLeCP
newしたからdeleteされたんだろ。
mallocすればいいなじゃない?
暗黙でfree呼ばれてもデストラクタ呼びそうにないし
0792デフォルトの名無しさん2015/02/08(日) 12:45:05.19ID:FEtsp/Se
単純にどこかでdelete呼んでいるだけとみた。
0793デフォルトの名無しさん2015/02/08(日) 12:45:43.28ID:JKFx7boS
思い込みでやれてる方に答えられる人は・・・
0794デフォルトの名無しさん2015/02/08(日) 19:35:43.09ID:4Mroy5Xc
Linuxの動的ライブラリーから例外を伝える方法はないですか
0795デフォルトの名無しさん2015/02/08(日) 19:49:10.30ID:yAnR3shi
>>787
なんにせよ再現するコードをideoneにでも張ってみろ
話はそれからだ
0796デフォルトの名無しさん2015/02/08(日) 22:06:30.03ID:vhN8tDg+
>>794
関数のリターンコードしかないんじゃね
WindowsのCOM例外だって、DLL越しに例外出してるわけじゃなく、関数のマイナスリターンを受け取ったラッパークラスがthrowしてるだけだし
0797デフォルトの名無しさん2015/02/08(日) 22:07:56.97ID:lrvjZnd4
初レスです

テキストファイルに画像名を入力しておいて、その画像を読み込むことってできませんかね?

テキストファイルの読み込みは分かるんですが、画像名を変数値において読み込むことが出来ません
0798デフォルトの名無しさん2015/02/08(日) 22:28:23.70ID:JJBPIwXc
それだけじゃ何とも
読み込むだけならstd::ios::binaryつけてテキストと同じように読み込めばいい
0799デフォルトの名無しさん2015/02/08(日) 22:34:50.30ID:VuJgIzCj
テキストファイルに画像ファイルのファイル名を書いておくという事か?
ファイル名の書き方はフルパスで書いてるんだよね?
0800片山博文MZ ◆T6xkBnTXz7B0 2015/02/08(日) 22:42:42.46ID:ogx/tY05
>>797
テキストファイルから読み取った文字列でパスファイル名を構築。
パスファイル名を使って画像ファイルを読み込む
0801デフォルトの名無しさん2015/02/08(日) 22:43:06.66ID:lrvjZnd4
>>799

そうです
0802デフォルトの名無しさん2015/02/08(日) 22:55:18.22ID:OjIKeA7u
どこで詰まっているのかわからないんだよ。 順番にやってみて。

1. テキストファイルに、別のテキストファイルのパスを書いておいて、その別のテキストを読み込む。
2. プログラムに画像ファイルのパスを直接書いておいて、それを読み込む。
3. 両方を合体させる。
0803デフォルトの名無しさん2015/02/08(日) 22:57:35.82ID:9fccusUd
"画像名を変数値において"

この言い回しに罠が潜んでいる気がする
0804デフォルトの名無しさん2015/02/08(日) 22:59:48.26ID:lrvjZnd4
ごめんなさい

勘違いしていまして、普通に出来ました。

お騒がせしてすみませんでした。
0805デフォルトの名無しさん2015/02/09(月) 12:15:10.44ID:uXRkJv4S
>>794
throwするだけで問題なく飛んでいくだろ
0806デフォルトの名無しさん2015/02/09(月) 12:26:45.33ID:Z/OgJqfR
>>805
C言語の関数とみなされるものがあると、そこで terminate() されちゃう。
よく知らないが、コンパイラオプションや extern "C++" みたいなものが要るのかも。
MSVCだと /EH (例外処理モデル) オプションに相当するのかな?

まぁ、そもそも C++ はライブラリの境界を越えて使うべき言語じゃないよ。
関数の名前付けも、例外や仮想関数の実現方法も、STLも、ライブラリ内外で同じものを使っている保証がない。
0807デフォルトの名無しさん2015/02/09(月) 15:08:03.45ID:uXRkJv4S
>>806
Cリンケージで公開している関数からthrowで届くが、なにか?
0808デフォルトの名無しさん2015/02/09(月) 15:14:09.52ID:uXRkJv4S
そもそも、libstdc++はshared libraryなのに。
0809デフォルトの名無しさん2015/02/09(月) 15:26:59.40ID:x5pP7N8e
>>808
libstd++の話なんか出てない
dlopenとかで繋げられる動的ライブラリーの話だろ
0810デフォルトの名無しさん2015/02/09(月) 15:29:15.24ID:uXRkJv4S
>>809
dlopenでCリンケージの関数で問題なく飛んでいきますが、なにか?
0811デフォルトの名無しさん2015/02/09(月) 16:22:44.68ID:5H5MU55h
>>810
g++はextern "C"関数の中に例外を通せるようになったということ?
0812デフォルトの名無しさん2015/02/09(月) 16:54:08.92ID:y+25O55h
>>811
人から情報貰っといて試しもせずに文句つけてたのか?
0813デフォルトの名無しさん2015/02/09(月) 17:22:18.84ID:Qj3ltr0R
常識的に考えて例外含めたC++の機能を使えないなら意味だろうよ
0814デフォルトの名無しさん2015/02/09(月) 17:23:34.92ID:Qj3ltr0R
× 意味だろうよ
○ 無意味だろうよ
させん
0815デフォルトの名無しさん2015/02/09(月) 18:41:48.75ID:U1Ilmw0R
>>807
お前の環境で動いたとかチラシの裏はどうでもいいから。
例外をサポートしないリンケージで例外スローしておいて「なにか?」とか、
お前のアタマが心配だぜ
0816デフォルトの名無しさん2015/02/09(月) 18:50:28.25ID:5H5MU55h
>>812
文句って、何のことやら
0817デフォルトの名無しさん2015/02/09(月) 18:54:45.92ID:sphOw1wN
出来る/出来ないとやる/やらないは別物だからね
機能的に出来るよって話でしょ
0818デフォルトの名無しさん2015/02/09(月) 19:15:19.22ID:y+25O55h
>>815
ほー
c関数にc++関数をコールバックに登録して例外出したらいけないとでも?
0819デフォルトの名無しさん2015/02/09(月) 19:18:06.24ID:y+25O55h
基本的にマングリング以外は呼び出しは互換。
例外を投げるのだから、リンケージに関係なくコンパイラはc++。
これで投げられない理由がない。
0820デフォルトの名無しさん2015/02/09(月) 19:43:05.53ID:dMqS5RFC
そりゃgccのデフォルトオプションに-funwind-tablesと-fasynchronous-unwind-tablesが付いてるからだ
昔のgccでコンパイルされたC関数は例外投げられたらちゃんとクラッシュしたし、今でも-fno-unwind-tables -fno-asynchronous-unwind-tables付けてコンパイルすりゃやっぱりクラッシュする
まして他のコンパイラでコンパイルされたC関数なら同じように例外サポートされてる保証などどこにもない
逆に言えば、全部モダンなgccで例外サポート付きでコンパイルされていることを前提とするなら、例外投げても特に問題はない
0821デフォルトの名無しさん2015/02/09(月) 19:53:57.68ID:M8FU3jIU
元の質問ではライブラリ側で例外投げて
呼び出し側でキャッチしたそうな雰囲気だから
双方が互換性のあるコンパイラで適切にビルドされてれば
問題ない、という回答になるのかな。
0822デフォルトの名無しさん2015/02/09(月) 20:03:22.36ID:Z/OgJqfR
>>820 有能
>>819 無能
0823デフォルトの名無しさん2015/02/09(月) 20:13:03.35ID:sphOw1wN
有り得ないケースを想定しても無意味
0824デフォルトの名無しさん2015/02/09(月) 20:14:07.31ID:X6dIQ9ex
Qちゃんまた泣かされてるの?
0825デフォルトの名無しさん2015/02/09(月) 20:18:33.53ID:dMqS5RFC
>>823
有り得ないケースって何を指してるんだ?
0826デフォルトの名無しさん2015/02/09(月) 20:47:55.49ID:LaqkBFHJ
>>822
おまえが無能だろwwwww
ライブラリを越えて例外投げれないとか言うから、libstdc++を例に出してやってもまだ凝りないかよw
0827デフォルトの名無しさん2015/02/09(月) 20:51:37.15ID:sphOw1wN
>>825
extern "C"で例外ってな話のつもり
やればやれるけどやる意味がない
キンタマ踏み合うケースを想定したらきりがない
0828デフォルトの名無しさん2015/02/09(月) 21:01:52.28ID:dMqS5RFC
規格(N4296)の17.6.5.12で「標準Cライブラリは例外を投げないが、例外として、program-supplied関数を呼び出す場合は例外を投げる」ってわざわざ書いてあるのに、有り得ないとまで言い切るのはどうかと思うがね
0829デフォルトの名無しさん2015/02/09(月) 21:03:56.84ID:sphOw1wN
>>828
テスト通らないからなぁ
0830デフォルトの名無しさん2015/02/09(月) 21:43:29.63ID:g8dM0PXc
C由来の関数とCリンケージ関数の区別が付いていない人が集うのはこのスレですか
0831デフォルトの名無しさん2015/02/09(月) 21:58:16.40ID:dMqS5RFC
Cリンケージの関数から例外を投げるケースが有り得ないって言うから、規格の時点でCリンケージと定められているC由来の関数でも例外を投げるケースが考慮されているって例を示すために引っ張ってきただけなんだが
0832デフォルトの名無しさん2015/02/09(月) 22:02:15.69ID:M8FU3jIU
そして qsort が共有ライブラリで実装されていても
-fexception だか何だかで適切にビルドされていれば
ライブラリ超えて比較関数内で投げた例外が届く、と。

でも普通に c から呼んでも例外投げてくるライブラリなんてのを
もし作るなら C リンケージにしないでおいてくれるべきだよね。
0833デフォルトの名無しさん2015/02/09(月) 22:48:41.52ID:9mlZ/Vie
>>831
>規格の時点でCリンケージと定められているC由来の関数

ほうほう、それは規格の何ページに書かれているのですか?
0834デフォルトの名無しさん2015/02/09(月) 22:52:29.27ID:jqtu7JjK
>>832
qsortを例に出すのは不適切だろ
qsortはCリンケージの関数を受け取るものとC++リンケージの関数を受け取るものの二種類あるんだよ
ほとんど、まともに実装されていないけど
0835デフォルトの名無しさん2015/02/09(月) 22:55:40.19ID:n06hI/j/
全くC++知らないけどビャーネの第4版読めるかな?
ロベールのC++入門と迷う
0836デフォルトの名無しさん2015/02/09(月) 22:58:22.18ID:0Iq2ks5n
>>834
ほうほう、それはISO/IEC 14882:2014のどこに書いてあるのですか?
0837デフォルトの名無しさん2015/02/09(月) 23:03:16.98ID:dMqS5RFC
17.6.2.3 Linkage
2 Whether a name from the C standard library declared with external linkage has extern "C" or extern
"C++" linkage is implementation-defined. It is recommended that an implementation use extern "C++"
linkage for this purpose.

……すまん、実装依存だったわ。
0838デフォルトの名無しさん2015/02/09(月) 23:10:51.38ID:0Iq2ks5n
マングリ問題があるから普通は"C++"リンケージだよね
float abs(float)とか
0839デフォルトの名無しさん2015/02/09(月) 23:29:54.61ID:VT0alxaD
10^150(10の150乗)桁の
素数を求めるアルゴリズムを
教えてください
0840デフォルトの名無しさん2015/02/09(月) 23:32:26.56ID:kCdpER4+
>>839
多倍長変数とAKS実装してください。
0841デフォルトの名無しさん2015/02/09(月) 23:33:03.18ID:6W03z7LQ
>>838
標準Cライブラリーの話してんだよな?
0842デフォルトの名無しさん2015/02/09(月) 23:34:11.63ID:jqtu7JjK
>>836
25.5
0843デフォルトの名無しさん2015/02/11(水) 13:32:48.37ID:Y/yz+yzv
back_inserterってエロいよね
どうでもいいけどね
0844デフォルトの名無しさん2015/02/11(水) 15:11:08.17ID:fznki0OC
push_backよりpush_frontの方が好きだな
0845デフォルトの名無しさん2015/02/11(水) 17:38:43.86ID:oz4RTyK1
なんでpush_lastとかpush_endとかじゃないのかな
あるいは単なるpushとか
英語圏では自然な感覚なのか
0846デフォルトの名無しさん2015/02/11(水) 18:46:33.47ID:nxT/cTMW
卑猥なこと考えながら命名したんじゃね
0847デフォルトの名無しさん2015/02/11(水) 20:46:52.43ID:fznki0OC
>>845
他のデータを後から入れたら最後じゃなくなるし。
最後にセットします!と宣言しておきながらすぐずれたらおかしい
0848デフォルトの名無しさん2015/02/12(木) 00:58:54.15ID:G6mvybFN
head, tail だとしっくり来るんだけどなぁ
0849デフォルトの名無しさん2015/02/12(木) 01:02:46.66ID:pVKW26ht
head, tailは既にある要素を指してる
front, backは方向をざっくりイメージさせるだけ
0850デフォルトの名無しさん2015/02/12(木) 01:32:46.54ID:CBdFIpzZ
>>845
現時点での、って考えたら矛盾してないし
backも一緒だよね

>>849
そのイメージがなんか逆なんだよなー
キューならラーメン屋の列に並ぶような感じで
back=後ろ、背中 なんだけども。
new_tail/headとかでもよかった
0851デフォルトの名無しさん2015/02/12(木) 07:12:15.92ID:CKPSod+9
add
これでおk
0852デフォルトの名無しさん2015/02/12(木) 07:51:10.72ID:cY6jzjUB
>>849
先頭、最後尾と前、後ろの違いだな。
字面からして日本語でも同じじゃないか。
0853デフォルトの名無しさん2015/02/12(木) 11:50:46.70ID:RvtVdJIV
std::back_inserter()なんかはわざと命名したのかもね
0854片山博文MZ ◆T6xkBnTXz7B0 2015/02/12(木) 22:10:50.65ID:PE152xwm
std::make_sharedの使い方を覚えた!
レベルアップ!
0855デフォルトの名無しさん2015/02/12(木) 22:27:19.70ID:5OHRavMJ
shared_ptrってc++11になったら
あまり使わないね。
unique_ptrで大抵すんでしまう。
0856デフォルトの名無しさん2015/02/12(木) 22:49:49.78ID:jvsVLl3C
コピーできないじゃん
0857デフォルトの名無しさん2015/02/12(木) 22:51:29.82ID:kUpijB8j
誰が所有してるのか曖昧なクソ管理を多用しなければ
shared_ptrの出番は少ない
0858片山博文MZ ◆T6xkBnTXz7B0 2015/02/12(木) 23:12:20.94ID:PE152xwm
shared_ptrは、デバッグ時に循環参照のチェックが必要だな
0859デフォルトの名無しさん2015/02/12(木) 23:19:44.13ID:hBWmgXOx
確かに shared_ptr を使いたくなるケースって、循環参照が発生しやすいケースと重なるんだよな。
循環参照が問題にならないケースは、生成と破棄が明確で、unique_ptr + 一時的な生ポインタで済んじゃう。

指定したオブジェクトだけ循環参照対応のGCで管理してくれるライブラリってあるかな?
特定のクラスを継承したり、指定された連想配列を使うよう強制される形式でも良いからさ。
0860デフォルトの名無しさん2015/02/12(木) 23:30:45.25ID:Rk3YDU9i
そこは boehm GC とか
0861デフォルトの名無しさん2015/02/13(金) 00:10:41.33ID:v7o1vyZw
>>857
本当はunique_ptrでいきたいんだが、それだとweak_ptrが使えないんで仕方なく。
0862デフォルトの名無しさん2015/02/13(金) 00:44:32.58ID:G7jPEu4l
キャッシュ機能とか作るにはshared_ptrしかないよね
0863デフォルトの名無しさん2015/02/13(金) 03:13:01.65ID:RI9GoVWK
今時weak pointer必須
0864デフォルトの名無しさん2015/02/13(金) 04:53:27.36ID:dikEWRXf
>>862
俺の場合、共有したいのってなかったら作るで作ったら消さないってのが多いからナマポで十分だな
カウンタなんかいらん
消すのは最後にコンテナ全部なめてdelete
0865デフォルトの名無しさん2015/02/13(金) 05:51:04.58ID:iao0OBU7
>>864
お前のコードは例外安全性が終わってるに1000ペリカ
0866デフォルトの名無しさん2015/02/13(金) 07:50:48.14ID:6T0J+IN6
キャッシュだったらuniqueで十分じゃね?
毎回キャッシュオブジェクトに問い合わせさせてインスタンスへの生ポ返せばいいのだから。
それこそcpuのキャッシュシステムみたいに
0867デフォルトの名無しさん2015/02/13(金) 07:56:19.57ID:6T0J+IN6
ちょっと足りないか。
オブジェクトの操作するなら
解放されないようロック機構はいるが、
これはsharedにしたところで状況かわらない。
0868デフォルトの名無しさん2015/02/13(金) 08:15:25.32ID:VTAHyJPf
>>867
キャッシュといっても、少なくとも2タイプあるってことだね。
 A. 他で使用中の場合に同じものを返す → shared_ptr/weak_ptr 向き
 B. 他で使われなくなってもしばらく保持 → 独自の管理システムがいる
0869デフォルトの名無しさん2015/02/13(金) 13:14:33.09ID:G7jPEu4l
>>866
参照してるものがキャッシュから外れて解放されたらアウトじゃん
0870デフォルトの名無しさん2015/02/13(金) 15:24:56.18ID:RYKXgmC/
生ポが怖いのでシェアード使いますです。
ユニークはコピーできないのが利点欠点はっきりしすぎて使いづらい。
0871デフォルトの名無しさん2015/02/13(金) 15:33:48.16ID:DIvXC7OY
>>865
こういうのって例外使わないスタイルだったら基本的に問題なくね?
bad_allocなんて上がって来たらどうせ死ぬしかないし、
一般的なOSのリソースもプロセス終了とともに消えるし。
0872デフォルトの名無しさん2015/02/14(土) 00:38:40.53ID:yb84CiHL
>>871
そういう環境ばかりではないけどね。
0873デフォルトの名無しさん2015/02/14(土) 00:50:01.72ID:a6xGr1RH
>>866
マルチスレッドで動かした時の事もちゃんと考えてね
0874デフォルトの名無しさん2015/02/14(土) 12:57:25.03ID:Zwqn9ydg
ユニフォームイニシャライザって糞なの?
make_uniqueでも採用されてないよね?
0875デフォルトの名無しさん2015/02/14(土) 14:36:48.05ID:xvNWKp27
普通に便利だと思うけど。
0876デフォルトの名無しさん2015/02/20(金) 23:53:28.09ID:Tylgw+9T
std::true_typeって何のためにあるのかわからん
true/falseで何か不都合あるんか
0877デフォルトの名無しさん2015/02/21(土) 00:07:47.59ID:4U2Jdz4k
SFINAEとか利用しようと思わなかったらそうかもね
0878デフォルトの名無しさん2015/02/21(土) 00:13:25.08ID:gHUeTDm+
>>876
テンプレートでコンパイル時に判定するため、主にSFINAEの為に使う。
enable_ifでググると具体的な使い方が見つかると思う。
それで理解出来ない場合はまだ早かったと思って諦メロン
0879デフォルトの名無しさん2015/02/21(土) 00:39:01.25ID:kGLUOU7n
よくもまあ口から出まかせを偉そうに言えるもんだな。
0880デフォルトの名無しさん2015/02/21(土) 00:40:24.58ID:bXnxwHVe
でまかせってなんぞ?
0881デフォルトの名無しさん2015/02/21(土) 01:30:28.70ID:K/I0UgM6
しまかぜ
0882デフォルトの名無しさん2015/02/21(土) 04:51:44.24ID:XrYFE+GA
>>878
SFINAEでつかうのにtrue/falseで何か不都合がある?
0883デフォルトの名無しさん2015/02/21(土) 05:12:32.88ID:bXnxwHVe
テンプレート引数に食わせるときに使うのかねー。
true/falseは値だから。
0884KUSO KOTE ◆unko./w.Osri 2015/02/21(土) 06:05:03.90ID:RMvJBifB
関数テンプレートはなぜか部分特殊化ができないので、
 template<typename T, bool mode>
 auto f(T);
 template<typename T>
 auto f<T, true>(T); // コンパイルエラー

実装を切り替えを、特殊化でなくオーバーロードで行う必要あるため(たぶん)。
 template<typename T>
 auto f(T, std::true_type);
 template<typename T>
 auto f(T, std::false_type);

enable_ifを使うならtrue/falseでもいいような気もする(たぶん)。
 template<typename T>
 auto f(T) -> typename std::enable_if<criteria1, ret_t>::type;
 template<typename T>
 auto f(T) -> typename std::enable_if<!(criteria1), ret_t>::type;
0885デフォルトの名無しさん2015/02/21(土) 10:37:40.11ID:Z5eoqA4p
>>876
仕様にそったis_xyz系のtraitsクラスを容易かつ正確に定義できるように
適切に継承するだけで仕様で要求されるインターフェイスとその機能を
自動的に実装できるようにするための部品として用意されている

traitsクラスの仕様で要求されることがstaticメンバのvalueでtrue/falseを
保持するだけ程度なら個々のクラスで個別に実装してもたいしたことはないが
要求が多ければ正確に実装することに手間がかかり間違える可能性も多くなる
そこを継承一つですませばその手間とリスクは大きく低減される

また将来traitsに要求される仕様が拡張された場合に
既存のtraitsクラス全てを直接変更することは大変だが
仕様が要求する機能を継承で実装しておけばその基底クラスを変更するだけですむ
0886デフォルトの名無しさん2015/02/21(土) 13:11:37.33ID:K93htcIB
関数テンプレートを部分特殊化できないのって何でだ?
0887デフォルトの名無しさん2015/02/21(土) 14:49:51.37ID:IRLoC/e2
>>886
マイクロソフトのSTLさんが「自分もよくわからない。検討の時間が無かったんじゃね」と言っていた
0888デフォルトの名無しさん2015/02/21(土) 16:21:13.08ID:IBIJdEhz
複雑で無駄に多機能な関数なんか作んじゃねーよ!クソが!!
というメッセージじゃないかな
関数に限らんが
0889デフォルトの名無しさん2015/02/21(土) 18:54:48.04ID:ZH1KgKQ4
ダミーのクラスメソッドを介せば事実上できてしまうのにな
0890デフォルトの名無しさん2015/02/21(土) 18:55:22.62ID:FlDtTMp/
そのおかげでstatic関数を持つクラスを書かなきゃいけなくって かえって煩雑
template<typename T, bool b> struct A {
  static void func(T t) {}
};

template<typename T> struct A<T, true> {
  static void func(T t) { cout<<"specialized"; }
};
0891デフォルトの名無しさん2015/02/21(土) 18:56:06.58ID:FlDtTMp/
あ、かぶった
0892デフォルトの名無しさん2015/02/21(土) 19:13:17.03ID:Wtgcife5
それ許してんだったら関数の部分特殊化も許せってんだ
0893デフォルトの名無しさん2015/02/21(土) 19:25:06.46ID:IBIJdEhz
逆にclass内classの特殊化は部分特殊化にしないとコンパイル通らないし(コレはC++14でも放置だろ)
カオスだよねえ
0894デフォルトの名無しさん2015/02/21(土) 23:29:58.20ID:vamQqIKP
関数テンプレートは全特化の時点でオーバーロード動作が直感的ではないケースがあり
部分特化を可能にするとさらに混乱を深めるだけと判断したからという話がある
ttp://www.gotw.ca/publications/mill17.htm

まず基礎として特殊化関係ないところから
呼ばれるのはどのf?

#include <iostream>
using namespace std;

template<class T, class U>
void f(T, U) { cout << "f-1" << endl; }

template<class T>
void f(T, T*) { cout << "f-2" << endl; }

template<class T, class U>
void f(T, U*) { cout << "f-3" << endl; }

int main()
{
int x = 10;
f(x, &x);
}
0895デフォルトの名無しさん2015/02/21(土) 23:32:39.43ID:vamQqIKP
そして完全特殊化をひとつ追加してみると呼ばれるのはどれ?

#include <iostream>
using namespace std;

template<class T, class U>
void f(T, U) { cout << "f-1" << endl; }

template<>
void f<int, int*>(int, int*) { cout << "f-1-s1" << endl; }

template<class T>
void f(T, T*) { cout << "f-2" << endl; }

template<class T, class U>
void f(T, U*) { cout << "f-3" << endl; }

int main()
{
int x = 10;
f(x, &x);
}
0896デフォルトの名無しさん2015/02/21(土) 23:47:24.87ID:VEVe47d3
プライマリテンプレートでオーバーロードが選ばれてf-2になる?
確かにキモイな
0897デフォルトの名無しさん2015/02/22(日) 00:34:45.55ID:jH4ZIjnM
早い話、関数はオーバーロード出来るんだからテンプレートの特殊化なんて必要ない
混乱を増すだけ
0898デフォルトの名無しさん2015/02/22(日) 01:40:08.60ID:njA91bPM
そんな低脳な思考をして決めてるから
どうしても部分特殊化が必要なったときダミーのクラスを介して実現することになって
最も混乱する結果になるんだろ
0899デフォルトの名無しさん2015/02/22(日) 05:37:31.11ID:J+2bP69K
>>894
オーバーロード解決が直感的でないだけで
f<int, int *>(x, &x);
って書けばクラステンプレートと変わらない?
0900デフォルトの名無しさん2015/02/22(日) 07:13:49.31ID:I8UIKXVn
type_traitsで
整数型をバイト長で仕分けるのにはどうやりますか?
0901デフォルトの名無しさん2015/02/22(日) 07:27:57.69ID:JzmwW28p
>>900
まず日本語を勉強します
0902デフォルトの名無しさん2015/02/22(日) 07:43:41.36ID:J+2bP69K
template<typename T>
struct unko_traits {
 static constexpr bool is_8bytes = sizeof(T) == 8;
};
0903デフォルトの名無しさん2015/02/22(日) 08:23:43.54ID:7T2uBnBd
>>902
そこに、is_4bytes とか is_2bytes とかを付け加えていくの?

template<typename T, int size>
struct unki_traits : std::integral_constant<bool, sizeof(T) == size> {
};

みたいにした方がよくない?
0904デフォルトの名無しさん2015/02/22(日) 09:30:01.33ID:+WCHq4X5
int8, 16, 32, 64 用の特殊化を用意して long が渡されたときに あっ となるのは良くある
0905デフォルトの名無しさん2015/02/22(日) 09:39:09.58ID:jAanobMm
wchar_t忘れてた、ってのはあった。
0906デフォルトの名無しさん2015/02/22(日) 10:09:56.22ID:7T2uBnBd
>>903
間違えた
template<typename T, std::size_t size>
struct unki_traits : std::integral_constant<bool, sizeof(T) == size> {
};
0907デフォルトの名無しさん2015/02/22(日) 11:49:06.94ID:wHKlPZGJ
一応言っておくが
>>900=>>903=>>904は糞コテQzの自演だぞ
0908デフォルトの名無しさん2015/02/22(日) 12:06:18.27ID:DVQv7PP4
どうでもいい
0909デフォルトの名無しさん2015/02/22(日) 12:59:38.49ID:DgG010jF
907は一生Qzの影に怯えて暮らす
0910デフォルトの名無しさん2015/02/22(日) 16:44:58.83ID:6xu9nlzV
int a, *p = &a;
これって合法?
0911デフォルトの名無しさん2015/02/22(日) 16:53:54.94ID:Ay80JrCN
>>910
はい。
プログラミング言語の文法は法律で制限されていませんし、
C++の言語仕様上も,の時点でaが宣言されたとして扱われます
0912デフォルトの名無しさん2015/02/22(日) 16:59:31.83ID:6xu9nlzV
>>911
サンクス。もやもやが解決しておなかスッキリ
0913デフォルトの名無しさん2015/02/22(日) 18:48:42.82ID:D2MNyIcZ
プログラミング言語の文法は、規格票という公式文書で定められているので
法律ではないが、それに近い形で制限されているともいえる
int a = a;
馬鹿げているがこれも合法
0914デフォルトの名無しさん2015/02/22(日) 18:50:48.56ID:RCi6HQ/x
規格票とか、どこのJIS信者だよ
老人はそろそろ引退した方がいい
0915デフォルトの名無しさん2015/02/22(日) 20:08:17.58ID:I8UIKXVn
>>903
そんなことしなくても
sizeof(T)==size
でいいじゃないですか?
0916デフォルトの名無しさん2015/02/22(日) 20:14:12.60ID:DOWqpBMt
すふぃなえでその構文が書けるんならね。
0917デフォルトの名無しさん2015/02/22(日) 20:14:59.64ID:I8UIKXVn
型のtrueだったか
間違えた
0918デフォルトの名無しさん2015/02/23(月) 07:25:58.50ID:ZxA135k5
#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> a;
typeof(*(a.begin())) b=2;
cout<<b<<endl;
return 0;
}
このほうがiterator_traitsを使うよりvalue_typeが定義されてなくてもよくて
より一般的で優れた方法だと思いませんか?
0919デフォルトの名無しさん2015/02/23(月) 07:56:57.30ID:ikUNweEd
果たしてそれでvector<bool>が扱えるのかな?
0920デフォルトの名無しさん2015/02/23(月) 08:47:22.22ID:bZptJtSh
なんてものが新たに出来たんだっけ。キャッチアップしてねぇw
0921デフォルトの名無しさん2015/02/23(月) 09:03:15.76ID:xos6Ur9w
新た……だと?
0922デフォルトの名無しさん2015/02/23(月) 11:13:43.08ID:1tjsQW0r
>>913
未初期化の値の読み出しになるから未定義動作じゃないの?
0923デフォルトの名無しさん2015/02/23(月) 11:15:42.25ID:Su9wFgfT
未初期化の値を読むだけなら未定義でもないでもないでしょ
09249222015/02/23(月) 11:23:12.19ID:1tjsQW0r
これ。
8.5 [dcl.init] p12
> If an indeterminate value is produced by an evaluation, the behavior is undefined
> except in the following cases: ...
続けて列挙されてる例外は unsigned narrow character type つまり char, unsigned char の
場合だけ。
0925デフォルトの名無しさん2015/02/23(月) 12:10:13.08ID:bZptJtSh
>>921
え、いつから?
0926デフォルトの名無しさん2015/02/23(月) 12:31:59.58ID:ZxA135k5
≫919
あつかえません。
0927デフォルトの名無しさん2015/02/23(月) 13:54:47.27ID:alAJyPLI
『日本はなぜ、「基地」と「原発」を止められないのか』矢部宏治・孫崎享 対談
https://www.youtube.com/watch?v=cBFE2dWTVQg

日本はなぜ、「基地」と「原発」を止められないのか
出版社: 集英社インターナショナル (2014/10/24)
矢部 宏治 (著)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

日本の最高権力者は日米合同委員会です。
日米合同委員会は日本国憲法より上にあります。
だから原発が止められないし日本人の被害者を助けようとしないのです。

国連憲章では日本は敵国とされています。
日本は敵国なので、いまだにアメリカ軍が駐留して日本が再軍備しないか監視しているのです。
国連憲章で敵国とされなくなるにはアジア各国と仲良くする必要があります。
日本と中国と韓国が仲良くなれば、日本は国連憲章で敵国扱いされなくなります。
そうなればアメリカ軍が日本から出ていかなければなりません(アメリカの支配から脱する)。

そうさせないために「2ちゃんねる」「ニコニコ」で中国叩きや韓国叩きのアジア分断工作が行われているのです。
「2ちゃんねる」「ニコニコ」「自民党」「2ちゃんを転載してるブログ(ニコニコが運営してる)」は日米合同委員会の下部組織です。
「2ちゃんねる」「ニコニコ」「2ちゃんを転載してるブログ(ニコニコが運営してる)」の役割は東アジアの分断工作です。
0928デフォルトの名無しさん2015/02/23(月) 14:15:39.40ID:ycMDsrXQ
>>925
1998年ごろじゃね
0929デフォルトの名無しさん2015/02/23(月) 15:20:40.38ID:bZptJtSh
>>928
>>918にあるtypeofはdecltypeとして規格化されて無くなったと認識している。
0930デフォルトの名無しさん2015/02/23(月) 17:43:10.70ID:ZxA135k5
enable_if_t最強だは
これさえあれば関数の特殊化いらね
0931デフォルトの名無しさん2015/02/23(月) 19:42:39.96ID:bZptJtSh
>>930
前者は切り捨てる原理、後者は採用する原理だから、片方あればいいってのはどうかね
0932デフォルトの名無しさん2015/02/23(月) 19:48:10.21ID:Xqa/R1TZ
>>929
何をわけのわからんことを。
vector<bool>は要素アクセスにプロキシーと呼ばれる技を使うから
decltype(*a.begin())が多くの人の予想に反してboolにならないって話だろ。
このvector<bool>の仕様はC++98から。
ついでにtypeof(C++98)はdecltype(C++11)を
置き換えるものではなく>>918はdecltype()の書き間違えと思われ
0933デフォルトの名無しさん2015/02/23(月) 19:50:01.59ID:Xqa/R1TZ
よく見たらtypeofだと?
typeidと勘違いした。
んなものはC++には無い
0934デフォルトの名無しさん2015/02/23(月) 19:51:32.16ID:14G+SWgQ
vector<bool>のせいで、一部のテンプレートクラスではメンバーとしてvector使えなくなることがあって
非常に迷惑
0935デフォルトの名無しさん2015/02/23(月) 19:57:39.44ID:ybCQEz/D
ん?typeofはC++98なんかじゃないだろ?
0936デフォルトの名無しさん2015/02/23(月) 20:00:06.77ID:ybCQEz/D
調べたらGCC拡張でtypeofというものがある
decltypeと同じようなもの
0937デフォルトの名無しさん2015/02/23(月) 20:05:36.15ID:KIT5eqTK
std::decay<decltype(*(a.begin()))>::type b = 2;
0938デフォルトの名無しさん2015/02/23(月) 20:46:30.87ID:4wnI7kSv
>>933
わかって頂けたようで恭悦でござる
0939デフォルトの名無しさん2015/02/23(月) 20:57:35.27ID:cHI4P7p2
すみません質問させてください.

Effective C++ 第3版
28ページ、下から13行目、
「コンストラクタが生成するデストラクタは…」
「コンストラクタ」→「コンパイラ」の間違いかと思うのですが
あっていますでしょうか?
よろしくお願いいたします.
0940デフォルトの名無しさん2015/02/24(火) 00:06:38.57ID:nvPp0222
正誤表にはみあたらないがミスだろうな
0941デフォルトの名無しさん2015/02/24(火) 08:26:44.14ID:DiBh8ZGt
コンパイラーじゃなくてコンパイラーズだよな
0942デフォルトの名無しさん2015/02/24(火) 12:52:14.82ID:lOtrXj7U
メソッドが派生クラスでオーバーライドされてるか判定するのに以下のようにしたら
一応うまくいったけど、GCCで-fpermissiveをつけないとコンパイルエラーになる
-fpermissiveをつけないでうまく行く方法があったら教えてください!

#include <stdio.h>

class Base { public: virtual void print() {} };
class Derive0 : public Base { public: virtual void print() {} };
class Derive1 : public Base {};

void IsOverride(void (Base::*p)()) { printf("Base::print\n"); }
void IsOverride(void (Derive0::*p)()) { printf("Derive0::print\n"); }
void IsOverride(void (Derive1::*p)()) { printf("Derive1::print\n"); }

int main(int argc, char* argv[]) {
Base* base = new Base();
Derive0* derive0 = new Derive0();
Derive1* derive1 = new Derive1();
IsOverride(&base->print); //→ Base::print
IsOverride(&derive0->print); //→ Derive0::print
IsOverride(&derive1->print); //→ Base::print
}
0943デフォルトの名無しさん2015/02/24(火) 13:35:29.77ID:h139alvj
>>942
そもそも「オーバーライドされてるかの判定」って何なんだ?
目的無いだろそれ。
0944デフォルトの名無しさん2015/02/24(火) 13:50:08.22ID:lOtrXj7U
>>943
目的は速度最適化
例えば大量の派生クラスのオブジェクトがあったとして
事前にオーバーライドされてない事が分かったら、
ループしてメソッド呼び出しをごっそり削除できる
(Base::printは何もしないとわかってるので)
0945デフォルトの名無しさん2015/02/24(火) 13:57:06.95ID:lOtrXj7U
>>944
事前に選り分けておくから確実に速くなる事は間違いないけどどれだけ速くなるかは不明…
0946デフォルトの名無しさん2015/02/24(火) 14:36:25.53ID:QjkvKQyz
>>944
それ仮想メソッドそのものを否定してるよな
メソッドにiterator渡して、仮想メソッドの中でループしなよ
0947デフォルトの名無しさん2015/02/24(火) 14:41:04.53ID:QjkvKQyz
>>944
get_print_methodという仮想関数を作っちゃいな
baseだけnull返せばいい
0948デフォルトの名無しさん2015/02/24(火) 15:03:04.53ID:U4onsSs4
オーバーライド先が静的に決まるならCRTPで充分だろ
virtual使う必要ねえ
09499422015/02/24(火) 15:27:24.93ID:lOtrXj7U
>>946-948
すんません、例が間違ってました
Base* base = new Base();
Base* derive0 = new Derive0();
Base* derive1 = new Derive1();
IsOverride(&base->print); //→ Base::print
IsOverride(&derive0->print); //→ Base::print
IsOverride(&derive1->print); //→ Base::print

という事で出来ませんでした…
多分vtblの中身を確認するような方法じゃないと無理っぽい
ポータブルな方法でなくてもいいので、もしお分かりになるようでしたら教えてください
自分も調べてみます…
0950デフォルトの名無しさん2015/02/24(火) 15:54:08.87ID:h139alvj
>>949
なんか釈然としない目的だな。
対象のクラス(baseとderived)をいじっちゃいけないという制約はある?
0951デフォルトの名無しさん2015/02/24(火) 16:00:11.74ID:lOtrXj7U
>>950
単なる最適化なんで基本的にderivedはそれ用の処理を強制したくは無いです
baseに何か仕込むのは問題ないです
0952デフォルトの名無しさん2015/02/24(火) 16:01:04.59ID:QjkvKQyz
>>949
CRTPにする
iteratorのfirst lastを渡して呼び出し先でループする
printメソッドの呼び出しが必要かのbool値を返すvirtual関数を作る
printメソッドへのポインタもしくはproxyを返すvirtual関数を作る
0953デフォルトの名無しさん2015/02/24(火) 16:02:28.08ID:QjkvKQyz
>>951
一般的には無駄な小細工という
ベンチマークとれば何の意味もないことが分かる
0954デフォルトの名無しさん2015/02/24(火) 16:18:50.73ID:lOtrXj7U
>>952
どうもです
> CRTPにする
既にあるものの最適化なので、これが適用出来るのか調べてみます

>>953
派生クラスのインスタンスが万単位であった場合は多分変わると思われ…
0955デフォルトの名無しさん2015/02/24(火) 16:48:32.82ID:h139alvj
>>954
オーバーライドされてれば、万単位で存在する派生グラスインスタンスのメソッド呼び出しを実行するんだろ?
そういうものの中に空メソッドの呼び出しが混ざったところで誤差の範囲内だろう。
0956デフォルトの名無しさん2015/02/24(火) 17:02:45.01ID:u708kfp8
初心者あるある
初期段階からなぞの自己流最適化(?)に固執
なお、実測はしないもよう
0957デフォルトの名無しさん2015/02/24(火) 17:04:29.73ID:lOtrXj7U
>>955
少なくとも半分近くは空メソッドです…
0958デフォルトの名無しさん2015/02/24(火) 17:08:52.77ID:lOtrXj7U
>>956
もう実装されてるものの最適化をしています
実測も何も最適化の実装が出来てません><
0959デフォルトの名無しさん2015/02/24(火) 17:18:50.32ID:yrkY1aca
>>957
もしかしてインスタンスごとにIsOverride呼びだそうとしてる?
それじゃ逆効果になるとしか思えんが
0960デフォルトの名無しさん2015/02/24(火) 17:28:55.57ID:lOtrXj7U
>>956
仮想関数の呼び出しは激重で空の関数であっても万単位で呼び出すと物凄い事になります…(ミリSecの世界ですが)
取り合えず今手元のPCで計測して確認しても同じでした

>>959
いえ事前に選り分けるので、最適化出来れば完全にコストがゼロになります
0961デフォルトの名無しさん2015/02/24(火) 17:38:53.43ID:U4onsSs4
激重って…
こいつdllも一切使わない気かよ
0962デフォルトの名無しさん2015/02/24(火) 17:41:15.96ID:cKh5eW/N
メソッド呼び出しその方法そのものがネックになるという特殊な目的を持ったプログラムなんだろうな
アルゴリズムよりもデータ構造よりもそこなんだろうなw
0963デフォルトの名無しさん2015/02/24(火) 17:41:17.50ID:J9mxQKtD
本当に初心者って無駄なことにこだわるんだなぁ
ってのがよくわかる
0964デフォルトの名無しさん2015/02/24(火) 17:51:11.33ID:I5dsQs7x
type_traitsみたいにしとけば?それで気になるものだけオーバーライドされていないことを明示すればいい。
0965デフォルトの名無しさん2015/02/24(火) 17:53:58.33ID:lOtrXj7U
要するにゲームなんですよ
空の仮想関数呼び出しでも数万になると1フレーム(16〜32ms)全部使ってしまうよ…(もちろん-O3で)
将来的な事を考えて最適かしておきたかったけど、取り合えず荒れそうなんでこれで失礼します
ありがとうございました
0966デフォルトの名無しさん2015/02/24(火) 17:58:15.86ID:maVIDPRw
>>965
いえいえ、どういたしまして
0967デフォルトの名無しさん2015/02/24(火) 18:16:21.69ID:lOtrXj7U
vtblにアクセスできたので自己解決しました (念入りな検証が必要ですが)
0968デフォルトの名無しさん2015/02/24(火) 18:36:29.58ID:4kvaLxjl
>>967
最初の1オブジェクトだけはメソッド呼び出しをして、空ならbreakするとかじゃダメなのか?
メソッドをvoidじゃなくてboolを返すとかに改造すればいい。
0969デフォルトの名無しさん2015/02/24(火) 18:50:04.46ID:qpgWNqCE
virtualにしておいて遅いからとvtblに手を出すとか、もう意味不明
0970デフォルトの名無しさん2015/02/24(火) 19:10:25.34ID:QjkvKQyz
>>954
何通りも小細工を試して測定してみなよ
全部無駄だったと分かるのも必要な勉強
0971デフォルトの名無しさん2015/02/24(火) 19:14:24.51ID:1AZ7OyIV
そもそも空の仮想関数呼び出すだけで処理時間足りなくなるなら、空じゃないの呼び出したら結局処理時間足りなくなるよな?
0972デフォルトの名無しさん2015/02/24(火) 19:22:27.69ID:lOtrXj7U
>>970
>>965で計測してるよ
こんな単なるループ(と言うほど単純じゃないけど)処理はCPU負荷は数%程度に収めておくべきだけど
逆算すると1000回程度が限界になってしまう (空の仮想関数呼び出しだけでね)
最適化出来たので、数%以内に収める場合は倍の2000ぐらいを最大に出来る (半分が空なんで)

取り合えず派生クラスのソースを一切いじらずに倍の呼び出しが出来るようにはなったよ
(使えるCPU負荷が数%が前提だけど)
0973デフォルトの名無しさん2015/02/24(火) 19:24:21.21ID:+CwBepxb
1万回で1msかかると言うことは
1回で100nsということになる。
そんなにかかるわけ無いだろ。
0974デフォルトの名無しさん2015/02/24(火) 19:39:16.45ID:nXbhU8yM
空のメソッド
0975デフォルトの名無しさん2015/02/24(火) 20:01:48.14ID:wUt0v/PU
nsec なめんな
メモリ速度を統一してから語れ
0976デフォルトの名無しさん2015/02/24(火) 20:21:16.53ID:1AZ7OyIV
http://melpon.org/wandbox/permlink/JN8urRQ5e8Kd0aDs
最適化なしでも空の仮想関数なんてこんなもんだよ
それとも1Fで250万回くらい呼び出してるのだろうか
0977デフォルトの名無しさん2015/02/24(火) 20:42:39.71ID:lOtrXj7U
>>976
これのマシンスペックってどうなの?かなり速いと思われる
あと同一インスタンスじゃなくて3万位インスタンス作ってみて
0978デフォルトの名無しさん2015/02/24(火) 20:49:51.07ID:RU+6zZPL
自分もやってみたが1000万の呼び出しで平均100msぐらいだったな
0979デフォルトの名無しさん2015/02/24(火) 20:58:42.58ID:3bOMA4P1
毎フレーム数万の対象にprintって何してんだよ。
そこが間違ってる。
0980デフォルトの名無しさん2015/02/24(火) 21:15:43.86ID:1AZ7OyIV
printする対象が何なのかは知らんが、人間の目は1Fで3万個表示されても反応できるわけない。適当にprintする範囲決めて後はサボるんだよそういうのは
0981デフォルトの名無しさん2015/02/24(火) 21:36:38.59ID:BgZzwVFO
>>977
1000とか2000じゃねーの?さっきの話だと。
てか3万もインスタンス作るなんてしたら最適化云々以前にキャッシュミス起きない?まぁそれこそマシンスペック次第だろうけど。
0982デフォルトの名無しさん2015/02/24(火) 21:58:09.18ID:tK3k6wpp
>人間の目は1Fで3万個表示されても反応できるわけない

3マンコで十分なことも多いだろうが
わけがないとまで言い切られると根拠が知りたいね
どうせ出せないだろうけど
0983デフォルトの名無しさん2015/02/24(火) 22:04:11.48ID:1AZ7OyIV
ゲームなんだろ? 三万個の何をprintするのか分からないけど、文字にせよ画像にせよ、画面上に3万個の何かを表示されてもプレイヤーにとっちゃ情報多すぎるから、多くても1000個とか表示できりゃ十分だと思うんだが
それとも三万個ってポリゴンとかの話? だったらGPUでやれよってレベルだけど
0984デフォルトの名無しさん2015/02/24(火) 22:06:42.71ID:13AsGslF
次スレ

C++相談室 part116
http://peace.2ch.net/test/read.cgi/tech/1424782918/
0985デフォルトの名無しさん2015/02/24(火) 22:19:47.40ID:3bOMA4P1
1万としても1080pの書いてればいいよでもで一つあたり200ピクセル16x16以下だぞ
何表示してんだよそれ
0986デフォルトの名無しさん2015/02/24(火) 22:31:09.16ID:RU+6zZPL
AIの数が1万個とか
0987デフォルトの名無しさん2015/02/24(火) 22:39:44.75ID:3bOMA4P1
AIなんて毎フレームする必要ないし、別スレッドでやるとか他にやりようがある
0988デフォルトの名無しさん2015/02/25(水) 10:19:08.84ID:PWFuTKbn
別スレッドでやろうが何だろうが1msで出来る
処理に2msかけたくないこともあるわな。
ってのは別として単にメンバ関数ポインタとって
比較すれば済む話なんじゃね?これは。
0989デフォルトの名無しさん2015/02/25(水) 10:40:47.33ID:rpMKp3K5
メソッドが空かどうかを直接的に確認する方法なんてないんだから、「この場合はスキップ」ていうロジックをかなり恣意的に作り込むしかない。
基底クラスのメソッドは空という条件だって永久に成り立つわけじゃなからう。さう考えるとvtable覗くとか悪手だ。
0990デフォルトの名無しさん2015/02/25(水) 10:59:59.05ID:PWFuTKbn
実行速度を最適化して行くとコーディングスタイル的には
とても最適とは言えないものになることは良くある。

古めのスマフォでもサクサク動くように、たった
2倍程度の高速化のために醜いコードにすることなんてまだまだあるよ。

俺なら空の仮想関数呼び出しを省きたいほど大量に
空の仮想関数を持つインスタンスがあるなら、
そいつらを別のコンテナに入れることを考えるな。
0991デフォルトの名無しさん2015/02/25(水) 12:08:27.45ID:OrAC26C7
最適化されたコードが醜くなるかどうかは開発者のセンス次第じゃねーの?
つか2倍も高速化できる腕があるならそう醜くはならんだろ
0992デフォルトの名無しさん2015/02/25(水) 12:19:31.30ID:Wk2wN7sa
>>988
仮想関数の関数ポインタ取得しても実体はvtableのインデックスだから比較できないよ
0993デフォルトの名無しさん2015/02/25(水) 12:41:15.48ID:NWtD0Nmd
仮装関数だからじゃなくて引数をコピー渡ししてて遅かったってオチだったりしてな
0994デフォルトの名無しさん2015/02/25(水) 13:01:04.66ID:rpMKp3K5
>>968
0995デフォルトの名無しさん2015/02/25(水) 14:09:39.61ID:DG/ZSa4b
連続アクセス以外はペナルティだらけ、
間接参照はキャッシュの先読み出来ない、
これ考えたらポリモフィックは使えん。
間接参照が速くなるハードウェアアーキテクチャを考えんとな。
0996デフォルトの名無しさん2015/02/25(水) 14:42:18.45ID:rpMKp3K5
すべてconstexprにしろ
0997デフォルトの名無しさん2015/02/25(水) 17:49:31.81ID:UX9WnKJE
うめ
0998デフォルトの名無しさん2015/02/25(水) 17:59:09.70ID:qrwKMS1Y
つっても、実際の飛び先が同じならBTBがきいてそんなに遅くならない。
0999デフォルトの名無しさん2015/02/25(水) 18:24:58.60ID:mKx2rGPv
産んで育てよ
1000デフォルトの名無しさん2015/02/25(水) 18:32:42.90ID:Wk2wN7sa
梅
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。