C++相談室 part141at TECH
C++相談室 part141 - 暇つぶし2ch1:デフォルトの名無しさん
19/02/22 03:07:43.52 MgOIx7iK.net
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137 (正しくはpart138)
スレリンク(tech板)
C++相談室 part139
スレリンク(tech板)
C++相談室 part140
スレリンク(tech板)
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
スレリンク(tech板)
■長いソースを貼るときはここへ。■
 URLリンク(codepad.org)
 URLリンク(ideone.com)
[C++ FAQ]
URLリンク(isocpp.org)
URLリンク(www.bohyoh.com) (日本語)
----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

2:デフォルトの名無しさん
19/02/22 05:33:28.83 7jsMxmv+.net
Cの場合は
#define BIT(n) (1<<n)
if(data & BIT(3)){ data &=~BIT(3); }
みたいなやり方をするんだが、C++の場合は#defineは使わない方がいいらしいけどどういう書き方が
一般的なのだろう。

3:デフォルトの名無しさん
19/02/22 05:43:25.43 kNNcPZDM.net
inlineにしてる。

4:デフォルトの名無しさん
19/02/22 05:45:32.03 9HNz13T8.net
そういう場合にマクロ使うなと言われるのは、単にインライン関数にした方がややこしいバグを産みにくいってだけ
別にどっちでもいい

5:デフォルトの名無しさん
19/02/22 05:51:49.61 kNNcPZDM.net
そろそろonline関数も必要だよな。

6:デフォルトの名無しさん
19/02/22 06:59:58.96 uV/D6RzS.net
マクロ関数 BIT() の部分、マスク生成をinline関数にするか、
引数を2つ取って、整数値の指定ビットを落とした値を返すinline関数にするか、
if ~ の部分まで含めて、変数の指定ビットを落とすinline関数にするか…。
と思ってちょいと考えたら、この場合は if 不要と気づいた。
最初から 0 か、ビット操作の結果か、いずれにせよ data の bit3 は 0 になるね。
本筋とは関係ない部分だけど。

7:デフォルトの名無しさん
19/02/22 08:00:05.86 7jsMxmv+.net
>>3
inline関数ですか?
constexperでも関数は作れると思いますが、inlineの方がベターなのでしょうか?
constexper int BIT(int bitno){ return 1<<bitno;}
usingを使ってこんな書き方ができますが、マクロの変換はできないのでしょうか?
using Func = int(*)(int);
あとtemplateはあまり使ったことがないですが、なんかマクロ変換に使えそうな気がします。

8:デフォルトの名無しさん
19/02/22 08:17:36.02 9HNz13T8.net
constexprは暗黙的にinlineつくからconstexprでもいい
using Funcの部分は根本的に勘違いしてると思う
それの場合intを受け取りintを返す関数のポインタの"型"に
Funcという別名つけてるだけやで

9:デフォルトの名無しさん
19/02/22 08:29:39.37 9HNz13T8.net
あと前スレ>>999
PCゲームやスマホゲーでも、STL使おうが使わまいが標準のヒープを直接は使わないことはよくあるよ
コンシューマへの移植性やパフォーマンスのためにカスタムのメモリマネージャ作ってるメーカーなんてザラにある
PCだから/メモリ有り余ってるからお仕着せのライブラリを適当に使うだけでいい、と思ってるなら何も分かってない

10:デフォルトの名無しさん
19/02/22 08:34:10.02 nGlWTBX9.net
現実の開発では、とりあえず動くようにしてから余った時間で最適化したほうが速くなるんだけどね

11:デフォルトの名無しさん
19/02/22 08:39:17.41 nqPCiyAK.net
まぁオブジェクトコードから臭いを嗅ぎ取った事は
無いな、感じられる人は耳鼻科行った方が良いかと

12:デフォルトの名無しさん
19/02/22 09:28:57.73 15zpzt8/.net
>>9
スレ跨ぐなカス
いつゲームの話なんかしたんですかねえ???????
それともゲームしか入ってないんですか?????????

13:デフォルトの名無しさん
19/02/22 09:55:02.52 n7WbXSSq.net
>>9だけど、俺前スレ>>996じゃないよ

14:デフォルトの名無しさん
19/02/22 17:51:49.69 PtH+29Wq.net
「C」からって限定条件なら tcl/tk + canvas はありだと思うが
別に tcl の勉強しなくても使えるし

15:デフォルトの名無しさん
19/02/22 19:08:44.27 zu/11utG.net
Cから tcl/tk はどうやって使うの?

16:デフォルトの名無しさん
19/02/22 19:16:25.53 kNNcPZDM.net
ワイドスタジオ使っちゃえば?

17:デフォルトの名無しさん
19/02/23 10:20:57.99 zem2FMDi.net
void ff()
{
std::packaged_task<int()> pt([](){std::this_thread::sleep_for(std::chrono::seconds(5));return 0;});
auto fut(pt.get_future());
std::thread th(std::move(pt));
th.detach();
//int v(fut.get());
}
上記のように、taskの完了を待機せず、packaged_taskの寿命が尽きても実行時にエラーも出ないのですが
このようなプログラムはありですか

18:デフォルトの名無しさん
19/02/23 11:42:14.30 +DV3f+Dk.net
そいつにリソース占領させてみればいい

19:デフォルトの名無しさん
19/02/23 12:14:03.42 zem2FMDi.net
解決しました

20:デフォルトの名無しさん
19/02/23 18:45:10.43 3YtKndGk.net
紅蓮弐式のほうが強い。
ハイ論破。

21:デフォルトの名無しさん
19/02/24 14:23:19.37 YwY0sV++.net
C++ を使っても綺麗にならない
C++ を使ってる意味が無い

22:デフォルトの名無しさん
19/02/24 19:25:23.97 iK4D+UQi.net
C++に綺麗さを求めるの初めて見た。

23:デフォルトの名無しさん
19/02/24 20:13:55.34 +qyzr+Wj.net
最低でもインデントくらい揃えてほしいけどな

24:デフォルトの名無しさん
19/02/24 21:31:26.79 BOQZpNHf.net
揃えさせられるPythonの読みにくさを見るとある程度柔軟な方がいい

25:デフォルトの名無しさん
19/02/24 23:59:09.46 haqs87u6.net
>>24
お、おう

26:デフォルトの名無しさん
19/02/25 00:01:28.93 Jz0DexUX.net
つまりJavaか。

27:デフォルトの名無しさん
19/02/25 01:25:43.15 Jktx5+0Z.net
なんでやねん

28:デフォルトの名無しさん
19/02/25 01:34:14.73 1EOktSCH.net
ランタイム速度最速を謳ってバカに新機能の実験台になってもらう。
それがc++

29:デフォルトの名無しさん
19/02/25 06:06:13.74 pgIYnQ9M.net
>>22
ん?
普通に求めるでしょ?
見栄えとかアルゴリズムとか

30:デフォルトの名無しさん
19/02/25 06:43:23.26 AQp51hox.net
Most elementary use of C++

31:デフォルトの名無しさん
19/02/25 07:14:51.09 RhTHp1T7.net
>>29
多分そういう意味じゃない

32:デフォルトの名無しさん
19/02/25 07:40:11.99 4l/+z2Zp.net
古いサイトとか見てるとグローバルな関数に::ってつけるこだわりがよくわからん
::CreateProcessとかさ

33:
19/02/25 08:14:06.58 0evRXBiA.net
>>32
自分の定義した関数にはつけず、win32api には付けて区別しています…

34:デフォルトの名無しさん
19/02/25 09:12:10.78 RhTHp1T7.net
公式「バランス調整はVIP部屋を参考にする」
桜井「○○の使用率ガー」

アホ「調整はVIPの使用率できめるらしい」←????

35:デフォルトの名無しさん
19/02/25 09:12:42.56 RhTHp1T7.net
誤爆

36:デフォルトの名無しさん
19/02/25 10:45:46.00 rMTHv0xs.net
>>32
大規模開発ならスコープ明示するのはよくやること
std省略NGのとこも珍しくないしな

37:デフォルトの名無しさん
19/02/25 12:17:07.75 y5m/9TYH.net
>>31
だから綺麗さなんて曖昧な表現だけだと突っ込まれるって話

38:デフォルトの名無しさん
19/02/25 18:50:34.75 Jz0DexUX.net
では評価関数を。

39:デフォルトの名無しさん
19/02/25 23:50:43.17 sPAFtFpG.net
double の 999999998 と 999999999 の積が正しい答えである 999999997000000002 じゃなくて 999999997000000000 になります
なんででしょうか
double の範囲に余裕でおさまってますよね?

40:デフォルトの名無しさん
19/02/26 00:18:43.14 belfWXD5.net
仮数部の最大値9007199254740992を超えているから

41:デフォルトの名無しさん
19/02/26 00:20:50.15 H+xdnOpD.net
>>39
つ 有効桁数

42:デフォルトの名無しさん
19/02/26 00:22:22.81 kx+LOcr9.net
>>40-41
10^300 とかまで大丈夫だって思ってはいけないのですね
初めて理解しました

43:デフォルトの名無しさん
19/02/26 14:43:31.98 8+7ktUtN.net
桁落ち

44:デフォルトの名無しさん
19/02/26 15:56:22.96 5MxkS3P7.net
浮動小数点は元々、誤差があるから、大雑把な数値でよい
正確な数値を求める場合は、整数型か、decimal を使う

45:デフォルトの名無しさん
19/02/26 16:22:19.66 aKbIPEAT.net
>>32
同じ関数で、MFC 版と Win32 版があることがあり、混乱が生じて、
切り分けの難しい不具合を生じる可能性を避けるため、そうしている。
C++だと、実引数を省略することもできる場合があり、その場合、Win32版を
使っているつもりが、MFC版が勝手に呼び出されて、動作が自分の思ったものと
少し違ってしまう可能性があるかもしれない。この時、コンパイラは何の
警告も出してくれないかもしれない。それを避けたいため、絶対に
Win32版を呼び出したい場合には、:: を付けることがある。

46:デフォルトの名無しさん
19/02/26 19:26:51.90 7oeDt7bv.net
DoxygenがモダンC++に対応していないんだけど、何か代わりの物はありますか?

47:デフォルトの名無しさん
19/02/26 22:24:56.64 t7v3BAso.net
キーボードのPageUpとPageDownの使い方が判りません、他のボタンも。

48:デフォルトの名無しさん
19/02/26 23:24:35.69 S/5yarce.net
C++のthreadってOSの無いマイコン環境でも動作するんだろうか?
threadが使えるってことは、ハードウエア的に最低でもタイマー割り込みを使う必要が
あるんじゃなかろうか? そうするとそういうタイマーなどのハードリソースはすべて自前で
用意するというのが前提のマイコンではどうするんだろとふと疑問に思った。

49:はちみつ餃子
19/02/27 01:13:25.57 FtVEDFBt.net
>>48
どうにもならんのじゃない?
仕様に完全準拠した処理系 (ライブラリ) は提供できんってだけだろ。

50:デフォルトの名無しさん
19/02/27 01:32:45.56 apYcTfdI.net
effective Modern C++ / Scott Meyersには
C++11の偉業として
 C++の平行対応作業の大部分がコンパイラ開発側が負担する形で実現されたおかげで、標準
規格としてC++の歴史上はじめてどのプラットフォームでも動作が変わらないマルチスレッドプログラム
の開発が可能となりました。
と書かれている。
「どのプラットフォームでも」と書かれているがOSのないマイコンだってプラットフォームだからそれを含まない
と可笑しいとおもうが、、

51:デフォルトの名無しさん
19/02/27 01:37:31.77 3Jl+ieqT.net
>>50
そこは、対応しているプラットフォームでは、という前提がつくのは自明だと思うぞ、

52:デフォルトの名無しさん
19/02/27 01:59:24.57 VmfRF6bC.net
>>46
例えば何に対応してないの?

53:デフォルトの名無しさん
19/02/27 09:01:57.37 MitD/HmJ.net
そもそも、マイコンにスレッドなんてあるのか?
main 関数しか無いのでは?

54:デフォルトの名無しさん
19/02/27 09:20:12.60 fYEBa3GD.net
マイコンには関数も変数も無いだろ
機械語セットのどこにも関数とか変数とかの命令は無いじゃん
変数が存在してるように見えるのはコンパイラのおかげ

55:はちみつ餃子
19/02/27 12:06:10.51 FtVEDFBt.net
C/C++ というのはそういうランタイムサポートが期待できない環境、いわゆる「ベアメタル」でも使い物になる
システムプログラミング言語であるというのがキモの言語だろ。
フルセットで使える環境なら std::thread という共通インターフェイスを使ってねというだけのことで、
リソースが限られたアーキテクチャでもフルセットが使えるべきというほどのもんではない。

56:デフォルトの名無しさん
19/02/27 12:51:06.39 Gf38Q9uK.net
>>48
(組み込みの)マイコンでは、普通、single thread なんじゃないかな。
マルチスレッドを使えるOSを作るのは結構複雑。
>>53
そういうOSをマイコンに作れば使えるようにはなるだろうけど、そこまでは
やってないことも多いと思う。そもそもマルチスレッドはプログラミングが
複雑になり予想も難しくなるのでバグが入り易い。カメラや炊飯器が誤動作して
も困る。

57:デフォルトの名無しさん
19/02/27 14:09:36.66 +TCpifLa.net
>>53
mainが無いのもあった気がする

58:デフォルトの名無しさん
19/02/27 15:17:57.76 6BQDuKk1.net
>>53
PCよりテヘロジニアス化(専用機をCPUに統合)が進んでるので、GPGPUみたいな感じってネットで読んだことあるな。

59:デフォルトの名無しさん
19/02/27 15:37:08.27 HrTieKXO.net
>>56
どんなマイコンを想像してるのか知らんけど組込みOSならメモリー数KB程度から動作する
URLリンク(www.eforce.co.jp)
>>57
mainなんて単なるC言語とかのお約束だからスタートアップルーチンに手を入れられるなら変えることはいくらでもできるよ

60:デフォルトの名無しさん
19/02/27 15:48:15.61 jy5tl2qf.net
サービスなんてエントリーポイント2つあるし

61:デフォルトの名無しさん
19/02/27 18:55:35.12 BQO9B3mv.net
template<class T>
int print(T v)
{
 printf("%d",v);// intの場合
 printf("%lf",v);// doubleの場合
}
printfを使うことは必須なんですが、どうすれば実現できます?

62:デフォルトの名無しさん
19/02/27 19:11:05.97 qHrg9QHU.net
特殊化しよう

63:デフォルトの名無しさん
19/02/27 19:14:17.63 lylxu9As.net
typeidで分岐すれば

64:デフォルトの名無しさん
19/02/27 19:17:04.78 ZZbXSlBN.net
>>52
戻り値の型をautoと書くとオーバーロードを認識しなくなるとかです。

65:デフォルトの名無しさん
19/02/27 19:23:09.27 lylxu9As.net
auto戻り値なんてメリットあるか?

66:デフォルトの名無しさん
19/02/27 19:31:54.53 EHh9wz5w.net
コンパイル時の条件で型が変わるときはautoで済ますと楽

67:デフォルトの名無しさん
19/02/27 19:43:36.93 1o0vhyUy.net
>>61
単純にオーバーロードすれば?

68:デフォルトの名無しさん
19/02/27 19:53:26.31 ZZbXSlBN.net
>>65
decltype使うときとかです。

69:デフォルトの名無しさん
19/02/27 19:56:24.14 ZZbXSlBN.net
std::enable_if<>を使うと超長くなるんだけど、doxygenは戻り値の型の欄を改行してくれないので、関数名や説明の欄が横一文字とかになってしまいそうです。
何とかしてほしいです。

70:デフォルトの名無しさん
19/02/27 20:23:21.57 Lz5cBdad.net
>>65
constexpr auto succ(auto num) {
return ++num;
}

71:デフォルトの名無しさん
19/02/27 20:31:28.87 ajs1Ye6I.net
>>61
%lfて…わかってやってる、ワケないよな

72:デフォルトの名無しさん
19/02/27 20:40:31.82 G+GrvvOb.net
>>61
printf("%s", std::string(v).c_str());

73:デフォルトの名無しさん
19/02/27 20:45:05.91 G+GrvvOb.net
>>72
ミスった
std::stringじゃなくてstd::to_stringが正しい

74:デフォルトの名無しさん
19/02/28 07:48:59.08 nAsBylgf.net
なるほど、まず文字列に変換、統一してから %s で表示か。
>>62 の「テンプレート関数の特殊化」を教える例題って説も納得いくけど、
std::string の変換関数の好例でもあるな。
>>71 %lf は規格で認められてる変換指定だね、一応。
間違って使う奴があまりに多いので現状追認で追加された、
という経緯らしいけど。
どうやら C90 では未定義、C99以降は %f と同様みたい。

75:デフォルトの名無しさん
19/02/28 12:32:13.81 yyOtWed3.net
>>73
%06d とか %7.3f とかできなくなるやん

76:72
19/02/28 13:07:02.05 g9ECmttI.net
>>75
質問主がデフォルトの書式だからとりあえずそのままで書いた
型ごとに書式を指定するなら上にもあるように特殊化するしかないな

77:74
19/02/28 15:32:45.18 nAsBylgf.net
自分で書いといてアレだけど、
C++に含まれるCの標準関数ってどうなってるんだろ?
Cの規格に追従して自動的に更新されてくのか、
ある時点で分裂したら再統合されるまで離れる一方なのか。
後者だとしたら、C99以降でprintf()の%lfが正当になったとしても
C++に関してはどのバージョンでも未定義、って危険があるな。

78:はちみつ餃子
19/02/28 16:24:48.52 KlP/6TOW.net
>>77
今のところつかず離れずを維持してる。
C++ 中の C 関数は「この C 規格を参照」という感じで明記しているので、
ある程度になると状況を見て参照先を変更するってだけ。
まあ関数についてはそれでいいとして、
その他のところも記法は統一して欲しいよなぁ。
C の _Noreturn と C++ の [[noreturn]] はどっちかに統一するのじゃ駄目だったんかなぁ? とか。

79:デフォルトの名無しさん
19/02/28 17:54:53.03 zeNaE6xz.net
vector<object*> v
がありまして、んでobjectクラスはメンバ変数int numを持ってるとします
このときですねv.at(1)->num, v.at(2)->num,....v.at(n)->numでvをsortしたいなーってのがあるんですけど上手い方法無いもんでしょうか
全然思いつかなくて

80:デフォルトの名無しさん
19/02/28 18:01:05.88 3CdGs56r.net
>>78
そう言うのは好みだからどっちかが大人になって折れるかよほど力の差があるとかでないと統合は無理

81:デフォルトの名無しさん
19/02/28 18:07:46.80 zeNaE6xz.net
>>79ですが解決しました。失礼しました。
URLリンク(stackoverflow.com)
こちらですね

82:デフォルトの名無しさん
19/02/28 18:41:06.34 IByT54N8.net
英語だ!!!

83:
19/02/28 20:13:33.80 FII1Vkt+.net
>>61
確か double に対応する書式指定は "%f" であって "%lf" ではない、という記憶がありますが

84:デフォルトの名無しさん
19/02/28 20:22:30.93 SJVUajxC.net
K&Rのfloatは引数にするとdoubleに昇格するというルールが残っているのでしょう

85:デフォルトの名無しさん
19/02/28 23:35:18.37 IM+bn+eP.net
本質ではなく、どうでもいいところにしか突っ込めないんだなw

86:デフォルトの名無しさん
19/02/28 23:37:27.00 ufQTgCzR.net
プロトタイプ宣言されたfloat引数にはfloatで渡すけど
可変引数にはfloatは渡せないままなんだな何故か

87:デフォルトの名無しさん
19/02/28 23:45:49.79 SJVUajxC.net
>>86
va_list にそんな制限あったっけ?

88:デフォルトの名無しさん
19/02/28 23:51:53.97 LhFhdmbG.net
可変長引数関連はスタック周りを弄るコードを「マクロで」wrapしたものだから
C言語と互換性を持たせるためには仕様の詳細まで引き継ぐしか致し方なかったんじゃないの知らんけど
C++専用のva_listを名前を変えて作ったら解決したかもしれんが
知らんけど
ただしそうしたとしたら、extern "C"したのにC言語から呼ばれへん
何で!?となってプチ大混乱が生じそう
知らんけどな…

89:デフォルトの名無しさん
19/02/28 23:53:46.30 LhFhdmbG.net
printf()ではdoubleを出力できるのに、
scanf()ではfloatしか受け取れない(doubleをスキャンする機能が無い)というのは
C言語の七不思議のうちの一つ

90:デフォルトの名無しさん
19/02/28 23:56:03.03 SJVUajxC.net
MSDNの関連記事 読んでない
URLリンク(msdn.microsoft.com)

91:デフォルトの名無しさん
19/03/01 00:15:41.73 fP7U0W+N.net
しかしさすがにscanf()でdoubleをスキャンできるようにする近代化は一筋縄ではいかなさげ

92:デフォルトの名無しさん
19/03/01 13:14:40.93 ozM8zBQ9.net
>>89
えっ

93:デフォルトの名無しさん
19/03/01 19:20:57.20 HVxvwZsK.net
>>84
不定長引数関数ならば、という縛りがつきます

94:デフォルトの名無しさん
19/03/01 19:21:39.88 HVxvwZsK.net
>>91
普通に書式"%lf" でできるのではないですか?

95:デフォルトの名無しさん
19/03/01 19:33:29.87 WfqePbUu.net
>>89
それ何処の世界のC言語の話?

96:デフォルトの名無しさん
19/03/01 20:08:46.93 WfqePbUu.net
>>87
規格に書いてあるよ

97:デフォルトの名無しさん
19/03/02 10:59:08.67 +L4gK20K.net
出鱈目ばっかり書き込むスレですか?

98:デフォルトの名無しさん
19/03/02 11:55:35.34 0O78HlO0.net
>>93
できた!できたわ>>93素敵!!!11!!

99:デフォルトの名無しさん
19/03/02 12:04:22.76 0O78HlO0.net
ところで質問なのですが代入やコピー構築時に所有権を移動するクラスFooを造りたいのですが、
Foo::Foo(Foo& rhs) : m_p(rhs.m_p) { rhs.m_p = NULL; } // 引数が非constのコピコン
Foo& Foo::operator=(Foo& rhs) { m_p = rhs.m_p; rhs.m_p = NULL; return *this; } // 引数が非constの代入演算子
を定義して、VS2010とかで警告レベルを4に引き上げると
 C4239TypeからType&への変換です
という警告が出るのです
これはFooのムーブコンストラクタを定義したら直るので初めてムーブコンストラクタを定義したいのですが、そこで質問
Q1. ムーブコンストラクタにおいてはコピーされる側の変更はマジで不要?
   つまり、所有権移動が絡む今回のFooの場合でも次の書き方でおk?
Foo::Foo(const Foo&& rhs) : m_p(rhs.m_p) { }
Q2. ムーブコンストラクタにおいてコピーされる側を変更しても(実行効率以外は)無害?
   つまり、所有権移動が絡む今回のFooの場合でコピコンにならって次の書き方をしても安全?
Foo::Foo(Foo&& rhs) : m_p(rhs.m_p) { rhs.m_p = NULL; }

100:デフォルトの名無しさん
19/03/02 12:09:49.85 0O78HlO0.net
訂正orz
>>98
誤: >>93
生: >>94
>>99
誤: コピーされる側
正: ムーブされる側

101:デフォルトの名無しさん
19/03/02 12:23:27.09 LLfR4tsY.net
rhsにNULL入れてるってことはrhsのデストラクタで解放されたら困るってことでしょ
一時オブジェクトだろうが何だろうが破棄されるときにデストラクタは走るから、
その例だとNULL入れる必要はある
というかその例は綺麗にムーブを使うべき例

102:デフォルトの名無しさん
19/03/02 12:37:35.01 0O78HlO0.net
>>101
>rhsにNULL入れてるってことはrhsのデストラクタで解放されたら困るってことでしょ
なるほど確かに…
ていうか鋭い
>というかその例は綺麗にムーブを使うべき例
ホンマや(゚Д゚;)ムーブコンストラだけで動いたわ㌧クス、

103:デフォルトの名無しさん
19/03/02 12:51:51.79 0O78HlO0.net
実験してから質問せいやというご批判があるかもしれないので釈明
実験はした
しかしコピコンが定義されているとムーブコンは呼ばれなかった(から、>>99のQ1のムーブコンでもちゃんとイゴイタ)のである

104:デフォルトの名無しさん
19/03/02 14:47:21.97 66qf4QbX.net
えw
実験するのめんどくさいから質問してたわw
ダメだったんだ、ごめんなさい。

105:デフォルトの名無しさん
19/03/02 15:15:55.45 oy0Ht86m.net
コンパイルエラーがとれなくて困ってます
■ ヘッダー側
template<class T>
class Test
{
public:
  Test(void (*func)(T)) {}
  Test(void (*func)(const T&)) {}
};
typedef Test<int *> TestPtr; // テンプレート引数がポインタ型
■ 呼び出し側
static void func1(int *x) {}
static void func2(const int *x) {}
void main()
{
  TestPtr test1(func1); // OK
  TestPtr test2(func2); // コンパイルエラー
}
VC2008だと以下のエラーになります。
1 番目の引数を 'void (__cdecl *)(const int *)' から 'void (__cdecl *)(T)' に変換できません。
func2みたいにconst付けるとなんでダメなんでしょうか?

106:デフォルトの名無しさん
19/03/02 15:52:41.75 0ZOGECoI.net
>>104
実験もせずに待つって、マナー以前に自分のためにならんだろ
答えが返ってくるまでボケっとしてんのかと
>>105
関数ポインタは引数の型が違うと別の型になる

107:デフォルトの名無しさん
19/03/02 15:54:45.54 uEwpVDqh.net
VC++でmsado15.dllをインポートしようとしても参照されずエラーになるのですが原因は何でしょうか?

108:デフォルトの名無しさん
19/03/02 16:25:34.65 gxSP/QDn.net
>>107
それだけでわかるか。エラー内容くらい書け

109:デフォルトの名無しさん
19/03/02 16:41:21.42 uEwpVDqh.net
>>108
C:\Program Files\Common Files\system\ado\msado15.dll に対応するエディターはありません。
このファイルの種類(.dll)のアプリケーションがインストールされていることを確認してください。

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) E1696 ソース ファイルを開けません "C:/Users/owner/Documents/Visual Studio 2017/Projects/20190227/20190227/Debug/msado15.tlh" 20190227 C:\Users\owner\Documents\Visual Studio 2017\Projects\20190227\20190227\Source.cpp 6
ソースは以下の通り
#include <stdio.h>
#include <tchar.h>
#if (WINVER >= 0x0601) // Windows 7 以降
#import "msado60.tlb" no_namespace rename("EOF", "adoEOF")
#else
#import "C:\Program Files\Common Files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
#endif

110:デフォルトの名無しさん
19/03/02 17:30:18.82 oy0Ht86m.net
>>106
なるほど。
typedef Test<const int *> TestPtr;
にしたらコンパイル通りました!どもです!

111:デフォルトの名無しさん
19/03/02 18:12:08.54 uEwpVDqh.net
>>109
必要かどうかわからなかったのですが
regsvr32.exeでmsado15.dllを登録
その後いろいろいじってビルドしてみるとコンパイルできました。
ただし出力ができませんでしたがコンパイルはできたのでとりあえず良しとします。
msado15.dllのようなDLLはC(VC)++で扱うのは難しいですね。
インテリセンスが働きませんから…

112:デフォルトの名無しさん
19/03/02 18:48:27.86 Gk4CLPf8.net
「c++ import dll」で検索!

113:デフォルトの名無しさん
19/03/02 20:32:59.25 YCnAoXOq.net
マクロは名前空間無いからな

114:デフォルトの名無しさん
19/03/02 22:58:26.16 9ABljqhX.net
はじめまして。
C++でスケジューラのようなものを作りたいのですが、
相談に乗っていただけますでしょうか?
C++/MFCのMDIを使用して、ウィンドウ内に複数のウィンドウを配置したいと思っています。
一つのウィンドウにはリスト形式でタスクの一覧を、別のウィンドウでは
ガントチャート形式でタスクの時間ごとにグラフを描画し、その他のウィンドウは各情報を表示出来ればと思っています。
そこで、上記のようなものを作るにあたって、
タスク一覧のウィンドウとガントチャートのウィンドウへドラッグ&ドロップで行き来したいのですが、
そもそもそのような事は可能でしょうか?
また、チャートの描画をするにあたって、グラフは2Dで描画しようと思っているのですが、
2Dのグラフィックライブラリ等を利用した方が簡単に実装出来るでしょうか?
もし良いライブラリ等があればご教示いたければ幸いです。
私自身、開発言語はC++かC#しかまともに使用した経験がないのですが、
実行環境のスペックがあまり高いものを準備出来ないので、
Core2Duo/メモリ2G程度、良くても型落ちのi3程度で、
実行速度も考慮したくC++を選択した次第です。
もし最適な言語や、開発手法があれば教えていただけると嬉しいです。
無知な部分が多いと思いますが、皆さんの意見をお聞かせ頂ければと思いますので、よろしくお願いいたします。

115:さまよえる蟻人間
19/03/02 23:07:26.95 HH5zv832.net
それなら、OLE D&Dを実装することになる。具体的には、IDataObject, IDataSource, IDropTargetインターフェースの実装。

116:デフォルトの名無しさん
19/03/02 23:32:17.29 4PbQivqk.net
c++でテンプレ使って実装を別ファイルで隠す場合、
// h //////////////////////////////////////////////////
template<typename T> class cls
{
public:
template<typename U> U func();
private:
T var = 0;
};
// cpp1 //////////////////////////////////////////////////
template<> template<> char cls<char>::func<char> { return var; }
template<> template<> int cls<char>::func<int> { return var; }
template<> template<> char cls<int>::func<char> { return var; }
template<> template<> int cls<int>::func<int> { return var; }
// cpp2 //////////////////////////////////////////////////
template<typename T> template<> char cls<T>::func<char>(){ return var; }
template<typename T> template<> int cls<T>::func<int>(){ return var; }
template<> class cls<char>;
template<> class cls<int>;
//////////////////////////////////////////////////
cpp1みたいに全部型指定していく場合はビルド出来るんだけど、
cpp2みたいに別けて型指定していくと出来ない。
cpp2みたいな事を実現可能な方法って無いですかね?
そもそも書き方が間違ってる?

117:さまよえる蟻人間
19/03/02 23:37:15.79 HH5zv832.net
ヘッダーで特殊化の方法を指定しないといかんとちゃう? 知らんけど。

118:デフォルトの名無しさん
19/03/02 23:45:00.12 0O78HlO0.net
cls::func()の定義を
 U cls::func()
ではなしに、
 void cls::func(U& x)
とかにすればおkなキモス、
なおそうするとテンプレートの特殊化以前に関数のオーバーロードで解決できてしまうヨカン、
void cls::func(char& x) { x = (char)var; }
void cls::func(int& x) { x = (int)var; }
void cls::func(double& x) { x = (double)var; }
void cls::func(std::string& x) { x = std::string(var, '0'); }
...
いくらでも作れる……!

119:さまよえる蟻人間
19/03/02 23:54:10.30 HH5zv832.net
IDataSourceじゃなくてIDropSourceだ。ごめんを。

120:デフォルトの名無しさん
19/03/02 23:59:54.93 4PbQivqk.net
>>117
特殊化の方法、、、私の知識では分からないですね、、、
>>118
hを、
template<typename U> void func(U& dest);
cppを、
template<typename T> template<> void cls<T>::func(char& dest){ dest = var; }
としてみましたが、状況は変わらずでした。

これ、全組み合わせを書かなきゃダメなんですかね?
template<T, U> みたいなのを、
template<T, int> みたいな感じで一部だけ型指定していくのは無理、
というのは見た事があります。

121:さまよえる蟻人間
19/03/03 00:04:53.16 KlFuUPR7.net
特殊化を知らない?

122:デフォルトの名無しさん
19/03/03 00:12:10.08 ET38y2ec.net
cpp2の翻訳単位内で完全に実体化させないとどうやっても外からはよべないので
少なくともcpp2の中ではそのように書かないといけないと思う

123:デフォルトの名無しさん
19/03/03 00:24:16.88 kd4WdA4I.net
確実にcppに実体作りたきゃ明示的インスタンス化は個別にしなきゃ駄目だろ

124:デフォルトの名無しさん
19/03/03 00:24:32.19 1zX/ygG4.net
>>121
この場合の特殊化は、どのような記述になるのでしょうか?
>>122
なるほど、やっぱり無理なんですかね?

これ、元となっているのは、
// h /////////////////////////////////////////////////
template<typename T> class cls
{
public:
int func();
private:
T var;
};
// cpp ////////////////////////////////////////////////////
template<typename T> int cls<T>::func(){ return var; }
template class cls<char>;
/////////////////////////////////////////////////////////////
みたいな感じで func() に戻り値の型指定を追加したいな、
って事でやりはじめたんですよね。
綺麗に書くのが無理そうならば、必要な物を全部書いていきます、、、

125:デフォルトの名無しさん
19/03/03 00:30:05.53 AQaNwhGs.net
要求仕様がいまいちよくわかっていないが(マテ
(1) 任意の型Tの値cls::varから任意の型Uの値を得たい(一種のconverterクラスを作りたい)
(2) 変換関数cls::func()の実装は隠蔽したい
ということならこんなんでど(ry
URLリンク(ideone.com)

126:デフォルトの名無しさん
19/03/03 00:38:22.33 1zX/ygG4.net
>>123
やっぱりそういう物なのですかね
>>125
仕様はそんな感じです
ただ、func() の戻り値をテンプレ使用でなんとかする方法が無いのかな、と
サンプルもありがとうございます

127:デフォルトの名無しさん
19/03/03 00:49:52.61 AQaNwhGs.net
>func() の戻り値をテンプレ使用でなんとかする方法が無いのかな、と
func()の戻り値をテンプレにしつつ実装は「完全に」隠蔽したい(ヘッダファイルに書くわけにいかない)となると
やっぱコアとなる変換関数は、必要なTとUの全組み合わせについて「完全に」「非テンプレートで」書かないといけない希ガス
(なぜなら、テンプレートのままcppに書いたら他のcppから呼べない(現行コンパイラはテンプレートの分割コンパイルに対応していない
(2)の隠蔽の要求を多少緩和して、template<class U> void conv(int src, U& dst) { ... } を
ヘッダファイルに書いても良いということならUを返すcls::func()をconv()を1個書いたらできるようにはなる
※ 個人の感想です
※ コードには個人差があります

128:デフォルトの名無しさん
19/03/03 00:57:11.45 1zX/ygG4.net
>>127
となると、現在のやり方でコードを完全隠蔽したいとなると、
全組み合わせをcppに書けって事になりますよね、、、

なるほど、了解いたしました
付き合って頂いた皆様、ありがとうございます

129:デフォルトの名無しさん
19/03/03 01:15:53.21 AQaNwhGs.net
スマン>>127は言い過ぎたかもしれん…
全組み合わせをcppに書く作業をそのcppの中でテンプレートを定義して省力化することは可能かもしれん
ただし、そのcppの中で定義したのと同じシグネチャ(名前+引数)でユーザーコードが別のテンプレート関数を定義でもしたら、
ODRに違反することになる(この場合実際に変な挙動になる危険性が大


130:きい)ので全体を無名namespaceで囲う必要がありそう 無名namespaceの中から選択的に関数をエクスポートできるのかは正直知らん あんまりテンプレート絡みで無茶はやりたくナサス



131:デフォルトの名無しさん
19/03/03 01:30:06.83 kd4WdA4I.net
定義は共通でして
template int cls<char>::func<int>();
みたいなのを使う分だけ書けば良い
ただ、今回の場合クラス内テンプレート関数の特殊化しようとすると怒られるからさらに工夫が必要

132:デフォルトの名無しさん
19/03/03 01:33:24.30 ET38y2ec.net
ああ、確かに
使わない関数テンプレートをcppで定義してそれの明示的インスタンス化を通してやれば省力化できそう
この場合その使わない関数テンプレートを内部リンケージにしても、その中で実体化要求されたテンプレートのリンケージには影響はないはず

133:デフォルトの名無しさん
19/03/03 02:24:28.96 5EsDLzeQ.net
Visual Studioで通ってもgccで通らなかったりするからテンプレートの実体化は厄介。

134:デフォルトの名無しさん
19/03/03 02:47:42.46 dVINV85+.net
もはやコンパイラありきの言語

135:デフォルトの名無しさん
19/03/03 02:53:02.86 kd4WdA4I.net
VC++がC++擬きの別言語なだけだろ
今ごろになってやっと2 phase lookup対応させた
structとclassが違うとリンクでこけるのも糞

136:デフォルトの名無しさん
19/03/03 03:13:19.05 ET38y2ec.net
VS2017以降のMSVCは許してあげてほしい・・・

137:デフォルトの名無しさん
19/03/03 05:50:17.03 EorZPwcP.net
えっ、何か革新的なことをしているの?
C++は今までつかったことがなかったんだが、最近マイコンの開発に使ってから
かなり気に入っている。これならPCでも使えるかもと今考えているところ。

138:デフォルトの名無しさん
19/03/03 06:33:00.88 ChZC+e8W.net
組み込み用途だとC++よりCの方が融通効くと思うんだが
最近の組み込みはひょっとして随分恵まれてるのか

139:デフォルトの名無しさん
19/03/03 07:57:12.43 EUJr/Yte.net
>>137
お前さんの認識が古いだけ
数KBメモリーとモダンなプロセッサならC++で開発は普通にできる

140:
19/03/03 10:05:41.46 OccEVyH1.net
ふと思ったんですが、Java でデコレーターを記述するのに
BufferedReader br = new BufferedReader(new InpustStreamReader(System.in));
などと、new したオブジェクトのポインタを取っておかず、new したまま放置してしまう書き方がありますが、
スコープ内で new したオブジェクトは、スコープを外れるときに C++翻訳系が自分で delete する、と決め打ちしてしまうと、互換性で問題がでるでしょうか?

141:デフォルトの名無しさん
19/03/03 10:18:54.68 0vjeZZiI.net
そのポインタを別の場所にコピーしてたらどうなる?
頭悪すぎだろ

142:
19/03/03 10:23:45.41 OccEVyH1.net
>>140
では、あからさまに new したポインタを捨ててしまっている記述に限り自動で delete する、というのはどうですか?
目的は…classpath を共用したいのです、classpath はあらたに c++ で書くとして

143:デフォルトの名無しさん
19/03/03 10:26:03.14 0vjeZZiI.net
>>141
そのポインタは渡した先でどうなってると思う?
頭悪すぎだろ

144:デフォルトの名無しさん
19/03/03 10:31:40.12 8Bef4COm.net
よくわかんねえけど楽してJavaを移植したいってこと?
Boehm GCでも使ってみたらどうだ

145:
19/03/03 10:35:18.92 OccEVyH1.net
>>142
new したポインタを捨ててしまっている記述に限り、処理系で delete する、と決めるのですから「ポインタを渡した先」というのは存在しないことになります
>>143
C++ と Java で classpath ライブラリを共用したいのです!

146:デフォルトの名無しさん
19/03/03 10:35:19.96 oO/57lY2.net
make_uniqueがやりたいってことかね

147:
19/03/03 10:41:59.49 OccEVyH1.net
>>145
スマートポインタを導入せずとも、ナマポであっても classpath を共用できるようにならないものか
そのためには c++ 処理系にどんな制限or追加を課せばいいか?

148:
19/03/03 10:47:25.17 OccEVyH1.net
>>142
内容を誤解していました、すみません
あらためて回答します
プログラマが new したポインタ値を変数に取っておく記述をした場合は、delete の責任はプログラマにあるものとし、処理系では何もしないものとします

149:デフォルトの名無しさん
19/03/03 10:53:36.82 rOejoJLo.net
>>116
遅レスだけど、テンプレートはcppに隠蔽しようとか考えない方がいいと思う
dllとかにしたいなら別だけど・・

150:デフォルトの名無しさん
19/03/03 10:59:02.77 kd4WdA4I.net
javaでnewしているからってc++でnewするなって
classpath共用が何を意味しているのかは分からんが

151:デフォルトの名無しさん
19/03/03 11:02:05.72 AQaNwhGs.net
・繰り返し構文とgotoの全廃

152:デフォルトの名無しさん
19/03/03 11:24:20.63 0vjeZZiI.net
>>147
だからさあ
newして渡した先では殆どの場合はそれをフィールドに入れてるだろ
殆ど100%のケースでは「何もしない」に該当するんだよ

153:デフォルトの名無しさん
19/03/03 11:44:43.82 lodoh91K.net
>>147
そのオレオレC++拡張の仕様を自分で決めて自分で実装して公開してみな。
万に一つもないと思うが、それを有用だと思って喜ぶ人がいるかもよ。

154:
19/03/03 11:58:52.90 OccEVyH1.net
>>151
んんー、それは c++ 的な扱い(delete はプログラマの責任)でいいかと、私の思考に何が抜けているのかな?もう少し考えて見ます

155:デフォルトの名無しさん
19/03/03 12:18:50.69 kd4WdA4I.net
>>139
規格ではdeleteしないものをdeleteしたら互換性に問題が出る。
自動でdeleteしたかったらスマートポインタ使うべき
独自c++擬き想定しているならc++17使うのも当然okのはず
生のnew使わせるなんて今時のc++ではとんでもない悪手

156:デフォルトの名無しさん
19/03/03 13:13:27.54 5kJ1RFDr.net
VS2017は十分な出来なんだがテンプレートの展開中に内部エラーで転けることがあってそこだけは不満

157:デフォルトの名無しさん
19/03/03 15:47:18.29 5EsDLzeQ.net
shared_ptr でJavaやC#のガーベージ・コレクションとほぼ同じ役目が期待できるから別にいいのでは。
C++は、shared_ptrが正式採用されたC++11で別の言語になった印象すらあるわ。

158:デフォルトの名無しさん
19/03/03 15:57:24.31 8Bef4COm.net
循環参照が検出できないからJavaプログラムの参照をそのまま置き換えればオッケーというわけでもない
もちろんナマポよりは遥かにマシだけど

159:デフォルトの名無しさん
19/03/03 15:59:19.15 rOejoJLo.net
>>155
面倒だとは思うけど、時間あるなら再現するコードと共にバグ報告送ってやってくれ

160:デフォルトの名無しさん
19/03/03 16:11:53.27 E4UxtVYi.net
unique_ptr<hoge> up0(new hoge());

shared_ptr<hoge> sp0(new hoge());
と書いたときと
unique_ptr<hoge> up1 = new hoge();

shared_ptr<hoge> sp1 = new hoge();
と書いた時で
違いは生じますか?
生じるとしたらどんな違いですか?

161:デフォルトの名無しさん
19/03/03 16:19:53.78 D2G4oQ9F.net
副業解禁で激変する若者世代とマネージャー世代のキャリア観
URLリンク(www.businessinsider.jp)
フリーランスの職種20個の仕事内容と平均年収をわかりやすく解説
URLリンク(www.proof0309.com)
時給1万円のバイトも。会社員向きのプチ副業を、“バイト芸人”が教える
URLリンク(headlines.yahoo.co.jp)
副業が「会社にバレる人」�


162:ニ「バレない人」の大差 https://headlines.yahoo.co.jp/article?a=20190303-00268007-toyo-bus_all 正社員の10%以上が副業 中には過重労働で体調崩す人も https://headlines.yahoo.co.jp/hl?a=20190227-00010000-wordleaf-bus_all 「副業で年2000万円稼ぐ男」に学ぶキャリア戦略 https://headlines.yahoo.co.jp/article?a=20190221-00266856-toyo-bus_all 加速する「副業社会」正社員の4割が「副業したい」 気になる収入はどれくらい? https://headlines.yahoo.co.jp/hl?a=20190218-00010001-danro-life おすすめ副業22選を現役フリーランスが解説【在宅も可能】 https://www.proof0309.com/entry/zaitaku-hukugyou 会社を辞めてフリーランスで働きたいあなたが知っておくべき10のこと https://www.businessinsider.jp/post-165731 フリーランスと会社員、働き方の根本的な差 広がる「雇用されない働き方」の課題とは何か https://toyokeizai.net/articles/-/263055 フリーランス人口は増える!今後は仕事もプロジェクト単位になる!? https://freelance.mts-career.com/population/



163:デフォルトの名無しさん
19/03/03 17:35:34.30 8Bef4COm.net
>>159
直接初期化とコピー初期化の違いを説明するとクソややこしい話になるんだけど
結論から言えばその場合はどっちも全く同じ

164:デフォルトの名無しさん
19/03/03 17:53:40.63 E4UxtVYi.net
make_shared使った方が良い?

165:デフォルトの名無しさん
19/03/03 19:22:53.95 8Bef4COm.net
うん

166:デフォルトの名無しさん
19/03/04 04:26:14.48 FZO2lxM7.net
new 呼び出しが少なければ少ないほど精神衛生に良い。

167:デフォルトの名無しさん
19/03/04 06:09:53.20 eTdHd+Gg.net
複数の関数の戻り値を足し合わせる処理で、それぞれの関数の戻り値をチェックしたい場合のすっきりする方法は何かありますか?
std::string result;
result += func1(a);
result += func2(b);
result += func3(c);
の各func1,2,3の戻り値をresultに足す前に空でないかを確認したいのです (1つでも空があった場合はresultも空にしたい)
単純に一時変数を用意して一つずつ判定するしかありませんか?

168:デフォルトの名無しさん
19/03/04 06:27:48.33 iluilBaY.net
typename Iterator::container_type::value_type
こんな風に::で三個つなげるのは合法ですかね??

169:デフォルトの名無しさん
19/03/04 06:31:54.66 nFXsjzZK.net
エイリアス使えば

170:デフォルトの名無しさん
19/03/04 06:33:10.80 7Cz1/mIW.net
funcN() を追加する直前の result.size() を記憶しておいて、
足した後に長さが増えてなかったら、今呼んだ funcN() の結果は空だった、
と判定することはできるか。
string から整数になるだけで、一時変数を使うのは変わらない上に、
処理内容が分かりやすくなるわけでもないけど。

171:デフォルトの名無しさん
19/03/04 07:56:06.21 EZgqhZII.net
>>165
例外

172:デフォルトの名無しさん
19/03/04 08:09:41.73 t1tsHTRA.net
>>166
合法

173:デフォルトの名無しさん
19/03/04 15:31:21.38 V3vkr0fP.net
unique_ptr<int> u(new int[2]{4, 5}); // OK (A) -> int * が作られる u.get()[n] でアクセス可能 *u だめ
unique_ptr<int> u = make_unique<int>(6); // OK -> int * が作られる *u でアクセス可能 u[0] だめ
unique_ptr<int[]> u = make_unique<int[]>(2); // OK (B) -> int [] が作られる u[n] でアクセス可能 *u だめ *u.get() 可能
unique_ptr<int *> u = make_unique<int>(2); // コンパイルエラー (C)
unique_ptr<int *> u = make_unique<int *>(2); // コンパイルエラー (D)
unique_ptr<int *> u(new int *); // ok -> int ** が作られる *u = &hoge あれば **u でアクセス可能
(C)(D)がエラーになる理由と
(B)を(A)の様に同時に初期化したいとき
どう書けば良いか知りたいです

174:デフォルトの名無しさん
19/03/04 17:39:35.24 rgTuscQv.net
C 型が違う
D int*が2から作れない

175:デフォルトの名無しさん
19/03/04 19:03:47.51 iluilBaY.net
>>170
どうもありがとう。

176:165
19/03/04 22:26:16.82 eTdHd+Gg.net
>>168
>>169
ありがとうございます
結局こうすることにしてみました
auto addString = [&result] (std::string&& temp){
 if (temp.empty()){
  throw 0;
 }
 result += temp;
};
try{
 addString(func1(a));
 addString(func2(b));
 ・・・
}catch (...){
 return "";
}

177:デフォルトの名無しさん
19/03/04 23:05:47.73 IrD+1pkV.net
void f()
{
 static std::mutex mtx;
 std::lock_guard<std::mutex> lock(mtx);
 //何がしかの処理
}
これっていいの?

178:デフォルトの名無しさん
19/03/04 23:25:00.41 tJNb7RRD.net
C++11以降はセーフ、じゃなかったかな。

179:デフォルトの名無しさん
19/03/05 00:17:46.56 w8adCz4V.net
セーフなわけがあるか!!1111!11!!!!1!

180:デフォルトの名無しさん
19/03/05 00:55:28.26 Lvsoqpfj.net
C++11だろうがなかろうが関係なくセーフだよ。

181:KAC
19/03/05 01:01:35.52 zhV7s4kG.net
人によってセーフの定義が違ってたりしない?

182:デフォルトの名無しさん
19/03/05 01:03:06.00 w8adCz4V.net
C++11以降はセーフになったらしい(キリ
URLリンク(cpprefjp.github.io)

183:デフォルトの名無しさん
19/03/05 01:04:55.09 w8adCz4V.net
Double Checked Lockingはジャヴァのメモリモデルがうまく対応できてなくて騒ぎになったことがある技法

184:デフォルトの名無しさん
19/03/05 01:11:12.97 w8adCz4V.net
もし関数内static変数の初期化をDouble Checked Lockingを使わずにスレッドセーフにしようとしたら、
関数に入る度に毎回馬鹿正直にクリティカルセクションに入るために1000クロックぐらい捨てることになってしまうま
スピンロックか何かの黒魔術で若干緩和する実装も有り得るかもしれんが基本は
ジャヴァではなくてC++の処理系がdouble checked lockingする分には
処理系がサポートするネイティブなアーキテクチャのみ考えれば良いから
問題が生じることは無いはずでとりあえずはめでたいと思うが、

185:デフォルトの名無しさん
19/03/05 01:34:00.08 Lvsoqpfj.net
グローバルなスタティック変数のように実行前に初期化する仕様にいまさら変えられない事情でもあったか。

186:デフォルトの名無しさん
19/03/05 01:38:41.08 w8adCz4V.net
リンカにシンボルを渡す手段がイマイチ決め手に欠くキモス

187:デフォルトの名無しさん
19/03/05 01:40:59.82 w8adCz4V.net
あと複数の翻訳単位間ではグローバル変数の初期化順序は保証されない(保証しようが無い)から
そういう混乱を避けるために関数内staticは関数に入ったとき初期化されてホスイ
個人的には使わないから知らんが

188:デフォルトの名無しさん
19/03/05 02:16:13.00 VDry4yCP.net
>>171
unique_ptr<int[]> u(new int[2]{6, 7});

189:デフォルトの名無しさん
19/03/05 02:54:35.71 YOwkwz81.net
std::dynarray ってどこ行ったん?
URLリンク(ezoeryou.github.io)

190:デフォルトの名無しさん
19/03/05 03:25:14.57 VDry4yCP.net
なんだろう
この違和感

191:デフォルトの名無しさん
19/03/05 04:45:14.68 mm49B1QN.net
ライブラリを作るときは、hpp にはクラスの定義を、cpp には実装を書く、と理解しています。
クラスのメンバでない関数はどう扱うべきでしょうか。
hpp にプロトタイプ宣言を、cpp に中身を書く、というので合っていますか。

192:デフォルトの名無しさん
19/03/05 04:47:10.42 VDry4yCP.net
inlineは?

193:デフォルトの名無しさん
19/03/05 04:50:23.83 xaYVlIsQ.net
なぜヘッダはクラス限定だとおもったんだ?
それ以前にクラス以外では使用したことがないのか?

194:デフォルトの名無しさん
19/03/05 05:01:47.80 OG2z9OX5.net
宣言(Declaration)と定義(Definition)は用語なんで覚えといた方がいいよ

195:デフォルトの名無しさん
19/03/05 05:18:53.19 3HlR5qin.net
ヘッダに書くのはクラスだから関数だからとかじゃなくて、複数の翻訳単位(≒cpp)で共通で使うかどうかで決まる
1つのcppの中でしか使わず外に見せないクラスや関数はcppの中でいいよ

196:デフォルトの名無しさん
19/03/05 05:48:49.52 mm49B1QN.net
>>190
inline なので(苦笑

>>191
ハ?
回答の体をなしていない。
> hpp にプロトタイプ宣言を、cpp に中身を書く
というやり方は許容されるという意味か。

>>192
覚えました。それで?

>>193
であれば、今私は複数の cpp ファイルを持つ予定はないので、ヘッダファイルは全く不要ということになります。

197:デフォルトの名無しさん
19/03/05 05:55:22.28 3HlR5qin.net
ライブラリなんだろ?
自分はcpp1つでも、他の人のcppで使わせるためのクラスや関数があるはずだ
それをヘッダに書け

198:デフォルトの名無しさん
19/03/05 05:59:24.21 mm49B1QN.net
>>195
その際、「プロトタイプ宣言はヘッダで、中身は cpp ファイルに」というルールかマナーか慣習はありますか

199:デフォルトの名無しさん
19/03/05 06:13:55.29 Lvsoqpfj.net
>>196
特にないから適当に他人のマネしとけばいいと思う。

200:デフォルトの名無しさん
19/03/05 11:45:31.15 HwCl8Q1J.net
>>193
>1つのcppの中でしか使わず外に見せないクラスや関数はcppの中でいいよ
staticは付けた方が良いですか?(苦笑

201:はちみつ餃子
19/03/05 12:27:38.14 mHzXPPXa.net
内部リンケージにするには static を付けるよりも
無名の namespace に入れる方が良いやり方
みたいな雰囲気があるんだけど、
インデントが深くなるのがなんか嫌なんだよね。
インデントは文法に影響しないわけだから、
付けないという選択肢もとれるけど、
それはそれでなんだかなぁって感じだし、
結局は static を付けちゃうんよ。
無名 (unnamed) namespace って使う?

202:デフォルトの名無しさん
19/03/05 12:35:48.55 zIeyIuEy.net
関数よりファンクタの方が速いという情報を見たのですが、メンバ関数を入れ子クラスでメンバファンクタ化すると高速化が期待できますか?

203:デフォルトの名無しさん
19/03/05 12:41:35.39 xaYVlIsQ.net
コンパイラ次第だろ
実験

204:デフォルトの名無しさん
19/03/05 12:50:59.28 zIeyIuEy.net
VC2017で試したのですがテスト用の関数が単純すぎるのかグローバルのインライン関数、クラスのメンバ関数、クラスのメンバファンクタで差異が見られませんでした・・・

205:デフォルトの名無しさん
19/03/05 12:51:22.93 fI+Bf2nm.net
どこに書いてもいいだろ
他人の書いたコードなんてどうせ誰も読まないし
読ませたいならドキュメントしっかりさせたほうがいい

206:デフォルトの名無しさん
19/03/05 15:12:40.70 pv9Sbimr.net
>>202
その「ファンクタの方が速い」ってのは、一般的に関数ポインタを介するのと比較して、だよ
理由はインライン展開できるからであって、その実験で差異が出ないのは当然

207:デフォルトの名無しさん
19/03/05 19:05:23.76 A2wr9SaM.net
ストアドよりインデックスのほうが速いよってスレなかったっけ。

208:デフォルトの名無しさん
19/03/05 20:02:38.14 zIeyIuEy.net
>>204
なるほど
ありがとうございます

209:デフォルトの名無しさん
19/03/05 21:56:22.01 +aoESyYJ.net
>>199
使う理由としてはメンバ関数を内部リンケージにしたらリンク速くなるかもという期待だけだな
実際速くなるか調べたことないけど
明示的にstaticとある方が読みやすいし、無名はデバッガで見たときクソ見辛くなるし
c++はこういうダメ仕様多過ぎてうんざりだわ

210:デフォルトの名無しさん
19/03/05 22:06:02.21 fIhIM0AX.net
腐ったビルド戦略のせいで無駄なオブジェクトコードの重複を生じるのはゼロオーバーヘッド原則に反しないのか?は疑問だな
極一部のマニアしか使わない機能付けてオナニーしてる暇があったら、いいかげん時代錯誤なビルド処理の抜本的な見直しをやってほしい

211:デフォルトの名無しさん
19/03/05 22:21:06.27 R3KidTI1.net
メンバ関数の数はクラスのオブジェクト生成コストにどれくらい影響しますか?

212:デフォルトの名無しさん
19/03/05 22:30:58.04 +aoESyYJ.net
>>209
まず自分で計測しろ

213:デフォルトの名無しさん
19/03/05 23:07:56.79 rlRU3gS5.net
>>209
数によるコスト差0だよ
>>210
計測したことあんの?

214:デフォルトの名無しさん
19/03/05 23:19:26.52 R3KidTI1.net
ありがとうございます
というのもメンバ変数がなく多数の関数をまとめただけのクラスがあるのですが、次のどれがいいのか悩んでいまして
(1) 全部static関数にする
(2) クラスをnamespaceにして全部グローバル関数にする
(3) 呼び出す場所で逐次インスタンスを作成する
(4) 呼び出し側クラスでこのクラスのポインタをメンバとして持ち、コンストラクタでインスタンスを受け取るまたは生成する
この場合のベストプラクティスはありますか?

215:デフォルトの名無しさん
19/03/06 00:13:14.35 twKwvQwO.net
(1)か(2)を好みに応じて

216:デフォルトの名無しさん
19/03/06 00:17:08.38 URVwFrjm.net
特に何もないなら2
templateと組み合わせるなら1とか3は多用するけど4は無いな

217:212
19/03/06 00:21:02.86 pU9AS85W.net
ありがとうございます
(2)でやってみることにします

218:デフォルトの名無しさん
19/03/06 00:32:13.90 Uli2bEJM.net
1 は、どうして君はすべての関数を、static 関数にできると思ったの?
static関数と、関数のライブラリ・モジュール化は関係ない
3, 4 は、どうして君は、関数を使うのにインスタンスが必要なの?
インスタンスの関数は、他の言語ではメソッドと言って、
そのインスタンスのメンバ変数を使うものに対して、特別な名称を付けている。
つまり、各インスタンスで値が異なるもの
メソッドは、一般的な関数とは異なる。
メソッドや一般的な関数と、関数のモジュール化は関係ない
例えば、Ruby では、
Math.log2( 8 ) #=> 3.0
このようにインスタンスを作らなくても、呼べる関数をモジュール関数と言って、
各インスタンスから呼ぶ関数を、メソッドと言って区別している

219:212
19/03/06 00:42:25.73 pU9AS85W.net
そう言われるとそうですね
オブジェクト指向ではmain関数以外全部クラス/構造体で作成するものだという先入観がありました

220:デフォルトの名無しさん
19/03/06 01:06:06.33 Riy5qgFP.net
>>214
無理矢理4にしたいケースを考えると、同じインターフェースを持つ関数群A,Bを場合によって切り替えて使いたい場合に敢えてインスタンスのポインタとすることもあるかな。今回の質問者の場合には当てはまらないだろうけど。

221:デフォルトの名無しさん
19/03/06 01:10:14.42 MDLmYlCa.net
>>193
>1つのcppの中でしか使わず外に見せないクラスや関数はcppの中でいいよ
名前無しでも何でも良いが、その場合はクラスはnamespaceの中に入れないと危険が危なすぐる…
同じ名前空間に属する同じシグネチャのFoo::func()が異なる関数として複数のcppで定義された場合、
どっちが呼ばれるか定まらない処理系が実在する(VC++2010とか
多分ODR違反で未定義動作なんだと思う

222:デフォルトの名無しさん
19/03/06 01:13:13.20 paKD8ls/.net
曖昧さは、利点にも欠点にもなりうる。
namespaceのグローバル関数ではなくクラスのスタティック関数にすることで曖昧さがなくなりコンパイルエラーを避けられる場合がある。

223:デフォルトの名無しさん
19/03/06 01:14:08.29 MDLmYlCa.net
>>219訂正
CPPでクラスを定義する場合は無名namespaceに入れないと危険が危なすぐる、
無名namespaceは異なる翻訳単位間では別名として扱われるから安全
一方、名前付きnamespaceでは異なるCPPで偶然
同じ名前空間に属する同じシグネチャのFoo::func()が作られてしまう危険性を排除できない

224:デフォルトの名無しさん
19/03/06 01:21:31.24 MDLmYlCa.net
>>220
そのクラスに非staticなメソッドを設けたとたん、
>>219と同じ話でどのFoo::func()が呼ばれるかわからないという不正な動作をする危険性が生じる
驚くべきことに、VC++2010の場合リンカが何のエラーも警告も出さない
それでいてしっかり変な動作になる(a.cppで定義したFoo::func()を呼んだつもりがb.cppで定義された同じシグネチャの別のFoo:func()が呼ばれる

225:KAC
19/03/06 01:53:40.57 tePy6oFI.net
>>216
C/C++では、staticなどキーワードが全く違う複数の意味で使われるから注意な。

226:216
19/03/06 02:00:53.56 Uli2bEJM.net
Ruby では、関数名のバッティングを避けるため、2重に囲む。
module 内にclass か、class内にclassを作る
module Net
class HTTP end
class FTP end
end
# インスタンス
Net::HTTP.new
Net::FTP.new

227:デフォルトの名無しさん
19/03/06 02:06:24.72 Riy5qgFP.net
>>224
rubyボットはお呼びでないからもう巣に帰ってくれ

228:216
19/03/06 02:12:57.91 Uli2bEJM.net
static みたいな複雑な概念を、初心者が理解するのは難しい
スコープを限定する意味と、生成・破壊のタイミングの違いと、
2つの異なる概念を使うから、難しい
C++ は、すべてのリソースの生成・破壊のタイミングを追っかけるだけでも、大変
ドワンゴ江添の本「C++11/14 コア言語」にも書いてあるけど、
呼ばれる関数を探索する方法に、Andrew Koenig が提案した、実引数依存の名前探索 (ADL)もある
実引数依存の名前探索とは、C++において関数呼出時に与えられた引数の型に依存して、
呼び出す関数を探索 (lookup)する仕組みのことである。
英語ではKoenig lookup、argument dependent lookup (ADL)、argument dependent name lookupなどと呼ばれる

229:デフォルトの名無しさん
19/03/06 02:46:55.34 Riy5qgFP.net
>>216
>>212の(1)はクラスのstaticメンバ関数のことを言っているのだか、>>216>>226を見てるとそれを理解していないように思える。
いつも書籍や他人の発言を引用して~~では、という書き方ばかりしているのを見かけるが、自分の中に落とし込んで理解できてないならわざわざ書き込まないでくれ。

230:デフォルトの名無しさん
19/03/06 04:34:02.55 3uIPjLtJ.net
>>227
#激同

231:デフォルトの名無しさん
19/03/06 06:59:23.47 3Q0pfzsC.net
質問(ネタ振り)に対して見当違いな返答は混乱の元ってのはその通りとして。
読者の立場では、話題が広がってくのは嫌いじゃない。
投稿者の意見として消化しきれてなくても、
参考資料として「誰それの書いたナントカって本では…」と
紹介してくれるのも有難いし。
その上で「あの著者/本は間違いが多い、例えば…」とか、
「記述が古い、新しい規格でもっと便利な機能が追加された」みたいな
追加情報(具体的なもの)が出てくればなお嬉しい。

232:デフォルトの名無しさん
19/03/06 09:56:40.41 mg6kC0Yg.net
>>205
SQLの話ですか(苦笑)

233:デフォルトの名無しさん
19/03/06 18:18:48.94 paKD8ls/.net
名前なし名前空間を名前あり名前空間の中に作ることができる。便利ちゃあ便利。
namespace hoge {
namespace {
int foobar = 1;
};
};

234:デフォルトの名無しさん
19/03/06 21:53:00.33 paKD8ls/.net
64bit環境で文字列ストリームクラスstd::ostringstreamのインスタンスのスタックサイズが、
gccで376バイト, VS2017で232バイトもあるんだがもっと小さくできるんじゃないの?
ちなみに、std::string はgccとVS2017どちらも32バイト。
どうよ?

235:はちみつ餃子
19/03/06 22:13:52.26 7/fqDaVy.net
>>232
std::ostringstream は文字列の一種というよりも入出力の系統だし、
std::basic_ostream を抱えているのでそんなもんちゃう?

236:デフォルトの名無しさん
19/03/06 22:36:11.10 cpQrrMgl.net
継承してるしデータとして保持しておくものでもないしな

237:デフォルトの名無しさん
19/03/06 23:24:49.53 TjQtzcPT.net
>>232
質問と関係ないけどスタックサイズって何かわかってないだろ

238:デフォルトの名無しさん
19/03/07 01:12:44.42 FDOfvyow.net
このあとスタックがおいしくいただきました

239:デフォルトの名無しさん
19/03/07 01:36:59.97 7rstSYcJ.net
ostream, ofstream, ostringstreamのスタックサイズはgccとVS2017でそれぞれ以下のようになる。
gcc: ostream=112, ofstream=264, ostringstream=232
VS2017: ostream=272, ofstream=512 ostringstream=376
どうよ?

240:237
19/03/07 01:39:26.14 7rstSYcJ.net
間違えた。gccとVS2017は逆です。
何が言いたいというと、組み込みで気軽に使えるC++を目指すならiostream周りを何とかしないとね、という話。

241:デフォルトの名無しさん
19/03/07 01:41:48.62 1uoKMGSD.net
組み込みで気軽に使えるC++を目指してないしどこまで削れるかはベンダーの努力次第

242:237
19/03/07 01:45:06.81 7rstSYcJ.net
Cがコンパイル言語であるにもかかわらずprintf()系の構文解析でJITコンパイルする野暮ったさを解決すべく導入されたはずのiostreamがまったく活かされていないね。

243:デフォルトの名無しさん
19/03/07 01:45:09.29 E2AqWV/D.net
その程度のスタック消費でヒーヒー言うような組み込み案件でiostream使わんだろ

244:237
19/03/07 01:49:48.32 7rstSYcJ.net
>>241
スタック消費でヒーハー言う組み込み案件に進出するのもC++のひとつの課題なのでは有馬温泉

245:デフォルトの名無しさん
19/03/07 01:52:03.09 1uoKMGSD.net
組み込み界隈がC++を活用する目標があるのであってC++の目標ではない

246:デフォルトの名無しさん
19/03/07 01:56:44.60 E2AqWV/D.net
from_chars
to_chars使えって話だろ
それかfmt

247:デフォルトの名無しさん
19/03/07 03:10:47.55 V0jGdMU/.net
class C : public std::function<int(int)>{};
というクラスを定義して、
int f(int i){ return i + 1; }
void main()
{
C c = f;
int i = c(1);
}
みたいな使い方って出来ないのでしょうか?
functional のヘッダを読んでみましたがさっぱりでした

248:はちみつ餃子
19/03/07 03:21:15.84 fFrTWbSf.net
>>245
やりたいのはこういうこと?
class C : public std::function<int(int)>{
using std::function<int(int)>::function;
};

249:はちみつ餃子
19/03/07 03:25:38.52 fFrTWbSf.net
めっちゃ雑にやったけど、
実際にはスライシングに気を付けてな。

250:デフォルトの名無しさん
19/03/07 03:42:38.23 V0jGdMU/.net
>>246
すいません、
知識不足でそのusingが何を意味しているのか分かりませんが、
std::function<int(int)> と、
class C : public std::function<int(int)>{} を、
外側から同じように使いたいという感じです。
現在は、
class C { std::function<int(int)> F; };
みたいになっており、
C c;
c.F = f;
int i = c.F(1);
と、こんな風に使われています。
std::function<int(int)> を継承させてしまい、.Fを消したい感じです。

251:はちみつ餃子
19/03/07 04:00:06.05 fFrTWbSf.net
>>248
単純に
class C : public std::function<int(int)>{}
とした場合、当然だけどクラス C にデフォルトで定義されるコンストラクタは
C::C(void); と C::C(const C&); だから、型が int (*)(int) であるような値を受け取る余地はない。
using std::function<int(int)>::function;
を入れると基底クラス std::function<int(int)> のコンストラクタである
std::function<int(int)>::function; をあたかも C のコンストラクタみたいにできる。
そんだけ。
public 継承してれば std::function<int(int)> の他のメンバはそのまま C のメンバとして
見えるからおおよそ期待する挙動になると思う。

252:デフォルトの名無しさん
19/03/07 04:06:09.21 V0jGdMU/.net
>>249
なるほど、そういう意味だったのですね。
ちょっと試してみます。ありがとうございます。

253:デフォルトの名無しさん
19/03/07 08:20:27.58 Yz7Qf/Kl.net
>>237
2ファイル同時に編集なんてしたらあっという間に食い潰しそうね

254:デフォルトの名無しさん
19/03/08 01:15:31.98 jsJl1WSX.net
テンプレートで何とかなりませんかね。

255:はちみつ餃子
19/03/08 02:12:42.20 7lrcs+kH.net
>>252
何が?

256:237
19/03/08 06:55:44.25 orP5LHkV.net
>>244 が提示してくれた from_chars, to_chars をgccに導入するにはどうしたらいい?
WSLのubuntuを使ってるんだけど規定でfrom_chars, to_charsの定義されたヘッダーファイルが入ってないっぽい。

257:デフォルトの名無しさん
19/03/08 08:26:54.11 ZyNdKvhR.net
>>254
たしか8.0でまだ整数しか実装されてない

258:デフォルトの名無しさん
19/03/09 11:07:13.09 jx9iLAiD.net
C++テンプレートテクニック第三版っていつ出るんですかね?

259:デフォルトの名無しさん
19/03/10 00:54:12.40 3tC9wBDx.net
待っていても何も始まらない!
君が書くんだよ!

260:デフォルトの名無しさん
19/03/10 17:07:48.90 yzd/Af8M.net
テンプレート引数がクラスでpush_back()メンバを持っているというようなことを検査することはできますかね?

261:デフォルトの名無しさん
19/03/10 17:10:17.73 2Qm7LFrM.net
std::is_classとdetection idiomで可能かと

262:デフォルトの名無しさん
19/03/10 17:15:14.74 yzd/Af8M.net
でてくしょんいでおむってどの本見ればわかりますかね?

263:デフォルトの名無しさん
19/03/10 17:16:33.87 yzd/Af8M.net
decltype使えばいいのかな。

264:デフォルトの名無しさん
19/03/10 17:18:14.94 2Qm7LFrM.net
載ってる本あるのかなあ
どうやるのかだけなら、ここのサンプルコードを真似すればいいと思う
URLリンク(cpprefjp.github.io)

265:デフォルトの名無しさん
19/03/10 17:21:49.62 yzd/Af8M.net
ありがとう。
ちょっと読んでみます。

266:デフォルトの名無しさん
19/03/10 22:01:07.26 yzd/Af8M.net
std::byteの使い方がよくわからない。
暗黙の何とかを避けるのに使うんだろか。

267:デフォルトの名無しさん
19/03/10 22:11:27.82 2Qm7LFrM.net
単純にバイトを表現する型というのが必要となった
char8_tと同じようなもん

268:デフォルトの名無しさん
19/03/10 22:30:00.78 yzd/Af8M.net
ソケットやファイルの入出力に使うって事かな?

269:デフォルトの名無しさん
19/03/10 22:49:36.48 8hqMg5Px.net
1バイトサイズの整数のつもりでcharを使ったらstreamで困ることがあったりしたしね。

270:デフォルトの名無しさん
19/03/10 23:15:04.53 yzd/Af8M.net
enum class byte : unsigned char { };
ってなってる。

271:デフォルトの名無しさん
19/03/10 23:21:10.96 6gF9+EwK.net
そのベースの型は実装依存
型を取りだして使えってことなんだろうか

272:デフォルトの名無しさん
19/03/10 23:21:22.34 ketqiw2j.net
なんでenum classなんだ?
typedefと何が違うの?

273:デフォルトの名無しさん
19/03/10 23:31:19.81 2Qm7LFrM.net
暗黙の型変換ができない

274:デフォルトの名無しさん
19/03/10 23:54:49.98 vvRzWHgY.net
こういうの行き過ぎた型安全に思えるけどね

275:デフォルトの名無しさん
19/03/10 23:57:35.21 6gF9+EwK.net
でも過去にそれで何かあったんでしょ
使うかどうかは任意だしある分には困らない

276:デフォルトの名無しさん
19/03/10 23:57:38.91 ketqiw2j.net
なるほど

277:デフォルトの名無しさん
19/03/11 00:01:39.15 4nU22VRt.net
is_enum_vがtrueになるとか違和感しかない

278:デフォルトの名無しさん
19/03/11 05:30:01.20 pTTv+VC9.net
>>265
なんで
uchar8_t
uchar16_t
uchar32_t
にしないんだろな

279:デフォルトの名無しさん
19/03/11 05:58:05.15 mFqdzmI2.net
既存のライブラリと衝突しまくるだろそれ

280:デフォルトの名無しさん
19/03/11 11:02:11.57 9rO3q8tQ.net
>>273
ひとりで全部作ってんのか?
誰か使い始めたらそれに巻き込まれるんだよ

281:デフォルトの名無しさん
19/03/11 13:49:05.84 kWR5MawD.net
WPFってどうなの

282:デフォルトの名無しさん
19/03/11 19:42:26.86 OenRxSRY.net


283:デフォルトの名無しさん
19/03/11 22:05:24.43 XA5PtgcF.net
getoptの標準化マダーチンチン(AA略

284:デフォルトの名無しさん
19/03/12 07:17:28.89 dEFL2K0T.net
void foo(std::function<void()> &&f){}
int main(){
auto lamda = [](){};
foo(lamda);
}
なぜコンパイルできるの?

285:デフォルトの名無しさん
19/03/12 07:23:08.39 FSVt1tPQ.net
>>281
オプションの渡し方がそもそも揺れてる

286:デフォルトの名無しさん
19/03/12 07:25:00.12 FSVt1tPQ.net
>>282
int main()
{
return main();
}
なぜコンパイルできるの?

287:デフォルトの名無しさん
19/03/12 11:46:00.90 6Uu2j9Xc.net
int main(std::function<void()> &&f){
return main([](){});
}

288:デフォルトの名無しさん
19/03/12 20:22:26.93 dEFL2K0T.net
すいません、低レベルのかたたちばかりでした。
聞くところ間違えました

289:デフォルトの名無しさん
19/03/12 20:30:56.16 Nd0ou12Q.net
なぜc++ main return省略でググらないのか

290:デフォルトの名無しさん
19/03/12 20:43:58.42 X3QnQcuN.net
getoptを標準化してしまうとハイフンで始まる変態ファイル名が鬼門になってしまうかな。

291:デフォルトの名無しさん
19/03/12 20:46:35.39 Zu3OGTTs.net
is_iterator、is_containerメタ関数はどうやったら作れるんでしょうね?

292:デフォルトの名無しさん
19/03/12 20:54:07.45 JuWddRAo.net
SFINAEでググれ、でいいんだろうか

293:デフォルトの名無しさん
19/03/12 20:55:53.60 Zu3OGTTs.net
スフィ姉は知っているんですが。
そのあとが。

294:デフォルトの名無しさん
19/03/12 21:00:20.04 cgm/opRe.net
iterator_traitsに通してメンバ型が得られるか確認する?
*とか++とかの操作について確認する?
containerはbeginとendでイテレータ取れるか確認する?

295:デフォルトの名無しさん
19/03/12 21:34:26.86 Zu3OGTTs.net
template <typename T>
using is_iterator = std::is_class<typename std::iterator_traits<T>::iterator_category>;
これは使えますかね?

296:デフォルトの名無しさん
19/03/12 21:58:48.29 l3wdXFC4.net
ぐぐればstack overflowがひっかかる

297:デフォルトの名無しさん
19/03/12 22:01:23.70 JuWddRAo.net
使えますかねって・・自分で試せるだろ

298:デフォルトの名無しさん
19/03/12 22:12:53.32 6dDI1fa3.net
マウントしててワロス

299:デフォルトの名無しさん
19/03/12 22:34:48.05 3laDxwEs.net
マウントは取りたいけど教えるのはめんどくさい

300:デフォルトの名無しさん
19/03/12 22:48:31.61 YKaKEG7g.net
結局はそれで何がしたいかによるんじゃね
標準のコンテナやそのイテレータで型分岐したいなら十分だけど、カスタム実装されたユーザー定義のイテレータがそのように実装されているかは分からんし
まあiterator_traitsの特殊化も追加で書くようにすれば使えるか

301:デフォルトの名無しさん
19/03/12 23:06:42.78 cgm/opRe.net
C++20からは一応イテレータはコンセプトがあるなあ
コンテナは知らん

302:デフォルトの名無しさん
19/03/12 23:12:51.59 YKaKEG7g.net
>>293
はダメな気がするな
template<typename T,typename=void>
struct is_iterator:std::false_type{};
template<typename T>
struct is_iterator<T,std::enable_if_v<std::is_class_v<typename std::iterator_traits<T>::iterator_category>>>:std::true_type{};

303:デフォルトの名無しさん
19/03/12 23:14:38.07 JuWddRAo.net
>>296,297
アホか、何がマウントだボケ
自分で試しもせずに2chに丸投げとか普通にダメだろ
>>298
iterator_traitsに与える型の要件(だけでいいかどうかはさておき)を満たすなら特殊化なんかいらんでしょ
リファレンス見る限り、iterator_traitsの特殊化はポインタのためだけにあると思う

304:デフォルトの名無しさん
19/03/12 23:27:20.69 Zu3OGTTs.net
>>300
どの本もそういう書き方になってるんだけど、その理由がわからない。
>>293は呼び出し方によっていろいろ問題が起きるんだけど、その理由がわからなさすぎる。
その辺がスッキリわかる本はないですかね。

305:デフォルトの名無しさん
19/03/12 23:39:14.10 YKaKEG7g.net
本は知らん
SFINAEが使えるのは宣言部分
そこで置換失敗すると宣言そのものが無かったことになる

306:デフォルトの名無しさん
19/03/13 12:04:15.67 lxBl+sTZ.net
>>297
マウントが取りたいだけで教える知識がないだけやねんw

307:デフォルトの名無しさん
19/03/13 12:37:00.35 mh4jyrHE.net
そう
分からない質問には自分で試せ
これがC++使ってる奴の特徴

308:デフォルトの名無しさん
19/03/13 12:47:27.60 QLyGxm6u.net
>>304,>>305
そう思うなら自分が教えてやれば?

309:デフォルトの名無しさん
19/03/13 20:50:37.56 u/DrurAb.net
規約はあるけど「実装が規約」をやっちゃってる部分が多くて、
しかもコンパイラのバージョン依存がひどいってのがc++だからな。
規約は語れても実際にどう動作するか語れない輩も多いだろうね。

310:デフォルトの名無しさん
19/03/13 21:07:13.50 QLyGxm6u.net
そういう構図じゃないと思うよ

311:デフォルトの名無しさん
19/03/13 21:25:53.81 Z/ka/TFK.net
どなたか iostreamの存在価値について熱く語ってくれないか。

312:デフォルトの名無しさん
19/03/13 21:34:23.99 VRJ3bLEu.net
いやだ

313:はちみつ餃子
19/03/13 21:38:23.77 xQTh8hgU.net
>>309
URLリンク(www.google.com)

314:デフォルトの名無しさん
19/03/13 21:55:23.80 780qHyAl.net
VS2019って4月2日に出るのかな?

315:デフォルトの名無しさん
19/03/13 22:19:08.88 DKlmxwmb.net
米国時間4/2にローンチイベント行ってるから日本だと3日かな

316:デフォルトの名無しさん
19/03/13 22:44:27.53 mh4jyrHE.net
>>306
だから分からないのにマウント取るのやめたら?

317:290=301
19/03/13 23:05:00.60 QLyGxm6u.net
>>314
バカだろお前
ID:Zu3OGTTsはSFINAEでググれと言われてSFINAEは知ってると言ったろ
その上で>>302の書き込み見ておかしいと思わんのか?
それに>>300で答えは出てるだろうが
> だから分からないのにマウント取るのやめたら?
お前のことだよ

318:デフォルトの名無しさん
19/03/14 18:41:51.50 qKfDR5xc.net
>>313
待ちどおしいね。

319:デフォルトの名無しさん
19/03/14 20:57:09.31 HZIDFMYl.net
このスレの住人は、新しいVisual Studioでどんなことに期待してるの?

320:デフォルトの名無しさん
19/03/14 20:58:50.91 30TndOaO.net
>>317
マウントされないこと

321:デフォルトの名無しさん
19/03/14 21:00:03.79 O0o087YX.net
仕様通りに動いてくれりゃそれでいいわ。

322:デフォルトの名無しさん
19/03/14 21:20:35.00 nuZulfE1.net
C++20の早期対応

323:デフォルトの名無しさん
19/03/14 21:25:28.09 xC4JJLNw.net
clang対応

324:デフォルトの名無しさん
19/03/14 21:29:12.31 vJRyyCPl.net
C#での使い勝手向上

325:デフォルトの名無しさん
19/03/14 21:36:15.68 r+Z4K3kn.net
フロントエンドをVSCodeにしてくれ

326:デフォルトの名無しさん
19/03/14 21:45:44.62 rlbQlqp5.net
メモリ喰わずに軽くなって…

327:デフォルトの名無しさん
19/03/14 22:54:08.60 qKfDR5xc.net
何個まで願い事聞いてくれるんだろ。

328:デフォルトの名無しさん
19/03/14 23:13:56.40 3EvgP48J.net
>>317
Expressを出してくれ

329:
19/03/14 23:19:01.48 NTAm4EVS.net
>>317
MFC…

330:デフォルトの名無しさん
19/03/15 06:01:20.22 qA/WFgyI.net
Windows formsのC++へ移植してmfcを完全に抹消してくれ

331:デフォルトの名無しさん
19/03/15 06:06:32.23 nvk7uoI+.net
>>317
オープンソース化

332:デフォルトの名無しさん
19/03/15 08:11:25.59 2KXTO6ja.net
本当によくかけとるわ。
この人たちで標準委員やったほうがいいんじゃないかと思う。
URLリンク(ttsuki.github.io)

333:デフォルトの名無しさん
19/03/15 08:17:17.58 qA/WFgyI.net
ゴミ

334:デフォルトの名無しさん
19/03/15 08:54:09.40 fLDhqMRG.net
けっこう癖が強いよね。例外やpimpl否定したり。

335:デフォルトの名無しさん
19/03/15 08:57:01.66 LNWMUSed.net
危険思想だなw
ヤバすぎてヘドが出るw

336:デフォルトの名無しさん
19/03/15 09:06:08.50 Uugk/tx2.net
まあでかいプロジェクトはこんなもんだろう。
例外は実際よくないと思うわ。

337:デフォルトの名無しさん
19/03/15 09:48:31.74 Af9j6Fb3.net
pimpl否定ってあったっけ?
うちのプロジェクトも原則例外禁止
むかしは一律禁止だったけど

338:デフォルトの名無しさん
19/03/15 11:11:39.02 t9j+keaC.net
>>330
古くさいって言われてなかった?

339:デフォルトの名無しさん
19/03/15 11:55:34.06 E1i6RSEf.net
googleのスタイルガイドは和訳が古くて英語版しか読まなくなって何年にもなるが追いついてるのか?

340:デフォルトの名無しさん
19/03/15 12:05:48.86 PdhXv0FK.net
例外無しとか小規模の組み込み以外で意味あるのかね?

341:デフォルトの名無しさん
19/03/15 12:37:29.90 hyh/CKnF.net
例外使った時点で疎結合もへったくれもなくなると思うわ。
能力的に幅のあるプロジェクトで使うには難しいよ。

342:デフォルトの名無しさん
19/03/15 12:56:39.19 ng8+eCdq.net
>>339
> 能力的に幅のあるプロジェクトで使うには難しいよ。
これには同意するけど
> 例外使った時点で疎結合もへったくれもなくなると思うわ。
意味不明
例外以外の方法使っても似たようなことをする羽目になるだけ
なら意図が明確な例外のほうがマシ

343:デフォルトの名無しさん
19/03/15 14:16:54.97 9vyMIRpZ.net
戻り値なら呼び出し元と呼び出し先の間の結合だけだが、例外はよりコールスタックの根本の方へ結合が及ぶことがある
フレームワークのように、例外を使ってあえて中間をすっ飛ばしてコールスタックの上と下を結合させるケースもあるけどね

344:デフォルトの名無しさん
19/03/15 14:19:06.67 9vyMIRpZ.net
念の為補足するけど、Javaの検査例外みたいに常に直上での例外処理を強制するスタイルは戻り値と事実上等価だからここでは論外ね

345:デフォルトの名無しさん
19/03/15 14:31:16.21 yhzlHwio.net
つまり標準ライブラリのほとんどを使うなと言うこと?

346:デフォルトの名無しさん
19/03/15 14:37:11.61 yhzlHwio.net
そもそも例外使った方が疎結合になるだろうに


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch