C++相談室 part163at TECH
C++相談室 part163 - 暇つぶし2ch1:デフォルトの名無しさん
22/12/30 23:16:31.37 DPUEZfMS0.net
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part162
スレリンク(tech板)
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

2:デフォルトの名無しさん
22/12/30 23:48:59.52 4Hd9NmeQ0.net
≫1 << 乙 << endl;

3:デフォルトの名無しさん
22/12/31 09:58:55.55 wqRRT9ag0.net
皆さまあけましておめでとうございます
今年もよろしくお願いします
今日も今日とて相談がございます
基底クラスのポインタを格納できるコンテナに押し込んだ派生クラスへのポインタから、その派生クラスのインスタンスをユニークポインタで生成し、それを規定クラスのユニークポインタに押し込んで使いたいです
std::vector<Base*> BaseCnt;
Driv1 Driv1_;
Driv2 Driv2_;
Driv3 Driv3_;
BaseCnt.push_back(&Driv1_);
BaseCnt.push_back(&Driv2_);
BaseCnt.push_back(&Driv3_);
~数々の名誉ある処理を挟んで……~
std::unique_ptr<Base> BaseUni;
BaseUni=どうにかして実体をユニポで生成する関数(BaseCnt.back());
BaseUni->Update();//ここで望んでいる挙動はDriv3のオーバーライドでございます
上記の、どうにかして実体をユニポで生成する関数、が実現できなくて困っています
template<typename T>
std::unique_ptr<Base>&& theFunc(T*t)
{
return std::make_unique<T>();
}
で行けるのかなと思いましたがいけませんでした(^^)……
そもそも基底クラスに押し込んであるため、T型で受けると基底型になってしまいます(^_^)……
どうにかして派生クラスにメモリを確保し、かつそれを規定クラスのユニークポインタに押し込めないものでしょうか?
このままでは年が越せない……
どうかおしえてください
私はc++プリミティブの混乱予約型言語でございます……

4:デフォルトの名無しさん
22/12/31 10:30:40.33 KJmYA7fT0.net
うだうだ長文書かんとコード全体をwandboxなりideoneなりに書いてくれや
Updateにvirtualついてないとかだったら張っ倒すぞ

5:デフォルトの名無しさん
22/12/31 12:27:13.18 GJ3jFwbSM.net
確かに問題点が複数ある&想定する挙動が曖昧で分からないから、コメントのしようがない。
最小限の再現コードと期待する挙動をwandboxなりideoneなりに書いてからの話だな。

6:デフォルトの名無しさん
22/12/31 12:49:15.56 vu28B3si0.net
>>3 こんなこと?
class Base;
using Base_Ptr = std::unique_ptr <Base>;
struct Base {
virtual ~Base () = default;
virtual Base_Ptr construct () const = 0;
};
struct Driv3: Base {
virtual Base_Ptr construct () const
{
return std::make_unique <Driv3> ();
}
};
int main () {
std::vector<Base*> BaseCnt;
Driv3 Driv3_;
BaseCnt.push_back(&Driv3_);
std::unique_ptr<Base> BaseUni;
BaseUni=BaseCnt.back()->construct ();
return 0;
}

7:デフォルトの名無しさん
22/12/31 18:55:55.24 MecdUwfcM.net
コメントは対応するコードの前後どちらに書く?
// 別行なら前だが
int i = 0;
int i = 0; // 同じ行なら後?
同じ行に書いてたものが変更で長くなって別行に移したら前後が入れ替わるの気持ち悪くない?

8:デフォルトの名無しさん
22/12/31 19:51:29.83 SJuvalLBd.net
基本、同じ行
無理があるときは前の行

9:デフォルトの名無しさん
22/12/31 19:52:40.15 SJuvalLBd.net
エディタの都合に合わせてたら人間向けのメモでなくなる

10:デフォルトの名無しさん
22/12/31 19:56:33.63 tNW0EEuh0.net
grepなどによるキーワード検索がやりやすくなるよう意識したら良い
ctagsや統合開発環境みたいな高性能な検索機能がなくても探しやすいのが理想

11:デフォルトの名無しさん
22/12/31 20:10:39.20 YncayN1e0.net
>>7
> 同じ行に書いてたものが変更で長くなって別行に移したら前後が入れ替わるの気持ち悪くない?
修正が面倒だとは思うけど気持ち悪くはないな

12:デフォルトの名無しさん
22/12/31 20:52:41.08 0LppXV+K0.net
気持ち悪いつか、気になるものは後で見ても気になるから
そりゃ気持ちよく直すでしょ

13:デフォルトの名無しさん
22/12/31 21:28:19.88 Wrtrkox0d.net
気持ちはわかるよ
差分ツールで見たとき差分として出ちゃうからな

14:はちみつ餃子
22/12/31 23:41:26.87 Lgb5NxGE0.net
コメントの移動だけが (一回分のコミットとして) 差分に出るのだったらちょっと嫌な感じだけど、
周辺のコードを修正した結果として行が長くなりすぎないようにコメントの位置も変えるという話なんだから
差分ツールで見たらどうせそこらへん一帯が出るわけでしょ。
その中にコメントのちょっとした移動が含まれるかどうかなんて気にするようなもんじゃないと思うけどなぁ。

15:デフォルトの名無しさん
22/12/31 23:56:21.90 thdzMSmPd.net
書くべきものは横着しないで書け
書かなくてよいもので油売るな
これだけのこと

16:はちみつ餃子
23/01/01 00:07:36.95 xRsGwj7i0.net
ところで私がよく使う言語に Scheme があって Scheme ではセミコロンから改行までがコメントになるんだけど、
Scheme の (というか主な LISP 系言語の) 習慣では状況によってセミコロンの数を変えるし
フォーマッタはセミコロンの数に基づいてインデントを変える。
URLリンク(www.gnu.org)
便利な習慣だと思うんだけど他の言語ではこういうのを見ないなぁ。

17:デフォルトの名無しさん
23/01/01 00:14:48.52 3UYI3pmj0.net
何なら、本文の途中で折り返して、行末コメントにするわ

18:デフォルトの名無しさん
23/01/01 03:55:44.18 zV40glZu0.net
>>16
いらんわ
全然、羨ましくない
願い下げ

19:デフォルトの名無しさん
23/01/01 11:42:43.03 83NHqx7aM.net
コメントを同じ行に書くことはほとんどないかなあ
そもそも1行コメントで済む処理っどんなの? コメント必要なのかな?
俺は処理の塊の前に意図など含めて長文コメントを書いてる

20:デフォルトの名無しさん
23/01/01 14:59:08.11 M9T6rHgL0.net
行内コメントはどこまで下げるのかと言う問題が、
  foo();         // xxxとyyyを更新
  assertIm(xxx) + Im(yyy) == 0); // 変換結果は共役のはず
--------->| 40 カラム?
-------------->| 56 カラム?
オートフォーマッター任せにしたいが定説が無さげ
perltidyだとなんか隣接する行コメは64カラム目か、それを超える場合は一番長いのに合わせてくれるが
コードの長さがかなり不ぞろいなとき罪悪感みある、
 a();  // (aのコメント)
b();  // (bのコメント)
 very_long_long_long_name_function_call_to_baz(long_long_name_param, 1234567); // (←のコメント)

21:デフォルトの名無しさん
23/01/01 15:01:54.19 M9T6rHgL0.net
あとif文の行内コメントも悩む、
  if (a==b)
  {
  }else

22:デフォルトの名無しさん
23/01/01 15:03:25.53 ZNJrRmgOa.net
・コメントは41桁目から
・一行は95桁迄
が俺のマイルール

23:デフォルトの名無しさん
23/01/01 15:05:17.13 M9T6rHgL0.net
あとif文の行内コメントも悩む、
  if (a==b) // ここには分岐条件のコメントを書くべき?
  {       // ここにはthen節のコメントを書くべき?
    ...
  }
  else    // else節のコメントはここでええのか?
  {      // それともここか?
    ....
  }
どう書くかによってブレーススタイルやオートコードフォーマッタとの
共存具合が変わってくるので行内コメントはいろいろ問題が多いシステム、

24:デフォルトの名無しさん
23/01/01 15:09:39.48 ZNJrRmgOa.net
>>21
// a と b が等しいなら...
if (a==b){
// 等しい時の処理
...
// 等しくないなら...
} else {
// 等しくない時の処理
}
が俺のマイルール
※ いないと思うけどコメントの内容にはツッコミ厳禁ね

25:デフォルトの名無しさん
23/01/01 15:17:33.19 ZNJrRmgOa.net
>>23
ありゃ行内コメントか...
if (a==b){ // a と b が等しいなら...
... //. 等しい時の処理
} else { // 等しくないなら...
... // 等しくない時の処理
}
確かに通常のコメントと行内コメントが混在するとモヤモヤするのはある

26:デフォルトの名無しさん
23/01/01 17:05:55.66 c0wTdgdc0.net
>>16
よく使うって、何に使うんだよ?

27:はちみつ餃子
23/01/01 17:43:06.94 xRsGwj7i0.net
>>26
手癖で使えるなじんだ言語ってひとつくらいはあるもんだろ。
俺はそれが Scheme だってだけで、やってることは自動でネットを巡回したりだとか
ファイルを条件別にフォルダに仕分けしたりだとかとかいった普段のちょっとした自動化とかだよ。

28:デフォルトの名無しさん
23/01/01 17:48:24.72 OS3h3nzh0.net
(真理情報)grep検索しやすいのが正義

29:デフォルトの名無しさん
23/01/01 18:20:59.18 c0wTdgdc0.net
ニンジャ凄いな。
全部のコア使い切ってる。

30:デフォルトの名無しさん
23/01/01 18:29:13.35 c0wTdgdc0.net
新しいパソコンのメリットを特に感じていなかったけど、大物をビルドすると圧倒的に速いな。

31:デフォルトの名無しさん
23/01/01 18:29:31.45 c0wTdgdc0.net
何か間違えたのかと思ったわ。
あまりにも早すぎて。

32:デフォルトの名無しさん
23/01/01 19:58:13.71 7cm8ugfN0.net
>>16
/** */ や /// を普通のコメントとは区別してドキュメンテーションに使うでしょ?
c++だったらDoxygenとか

33:はちみつ餃子
23/01/01 20:35:59.39 xRsGwj7i0.net
>>32
へー。
そういうツールを使ったことなかった。

34:デフォルトの名無しさん
23/01/02 15:24:57.96 8fX0q33xM.net
>>16
フォーマッタと相性悪すぎん?
Python といい見た目の違いに意味持たせるのカスでしかない

35:デフォルトの名無しさん
23/01/02 17:07:12.86 ArPslss00.net
PEP8

36:はちみつ餃子
23/01/02 17:17:16.57 tiICTfPp0.net
>>34
意味によってセミコロンの個数を変えるとそれをフォーマッタが見た目 (インデント) に反映するという話なんだけど

37:デフォルトの名無しさん
23/01/02 17:55:39.66 1k7qyNCA0.net
自分が理解できないものは使えない奴とか言ういつもの人でしょ
スルーでいいかと

38:デフォルトの名無しさん
23/01/02 19:45:33.11 G0Rqch2XM.net
>>36
すまん Scheme には普通の文末にセミコロン付ける訳では無いのね、そこ知らなくて勘違いしたわ
C++ に取り入れるならセミコロン以外の記法にする訳ね

39:デフォルトの名無しさん
23/01/03 08:07:29.43 vDbC1GAT0.net
>>37
必要性を感じていないものをいらんというだけだ
スルーしてもらえるならこっちも助かる
いらんつーてるものをしつこくすすめてくるな

40:デフォルトの名無しさん
23/01/03 08:12:15.59 vDbC1GAT0.net
忘れてもらっちゃ困るのは
C++界は新しい機能に前向きだ
待ってましたという新機能にはみんな飛びつく
凝り固まろうとしてるのと違う
特にC++11以後は断じて違う

41:デフォルトの名無しさん
23/01/03 08:39:47.41 cXTWG1PB0.net
誰もお前に勧めてなんてないし自意識過剰すぎるだろw

42:デフォルトの名無しさん
23/01/03 09:59:45.56 vDbC1GAT0.net
にわか横レスには俺も何も言ってないよ

43:デフォルトの名無しさん
23/01/03 11:34:31.19 Tocwdict0.net
C++11でshared_ptrが導入されて、C++に対するJava・C#の優位性がひとつ消滅したよな

44:デフォルトの名無しさん
23/01/03 13:45:59.96 BllUqxS60.net
10年以上も前のことを何を今更って感じもするし
std::shared_ptr以前からスマートポインタは
一般的だったから事実誤認のような気もする
特にC#が登場した2000年にはスマートポインタの利用は一般的だった
Java登場の1995年当時を知る人はいるかな?

45:デフォルトの名無しさん
23/01/03 14:00:08.10 Tocwdict0.net
>>44
> 一般的だったから事実誤認のような気もする
C++スレに書き込む人にとってはもちろんそうだろうけど、C++やらないプログラマにとってはそうではなかった
理解が広まるのに時間がかかる

46:デフォルトの名無しさん
23/01/03 14:23:27.79 InFt2tel0.net
モノとしては誰でも知ってたけど、標準に入ってるかどうかってやっぱりだいぶ違うんだよな
プロダクトでの使いやすさとか

47:デフォルトの名無しさん (ワッチョイ 9a01-+uJR)
23/01/03 15:05:23.38 cXTWG1PB0.net
>>44
1995年にはまだスマポは一般的でなかったと思う
デストラクタにdelete書きまくってた記憶がある

48:デフォルトの名無しさん
23/01/03 16:23:49.38 5xlop3x40.net
>>44 47
c++で言うなら前身のboost::shared_ptrの初出が1998年。
その前身のcounted_ptrの最初の提案は1994年だって。(rejectされたけど)

49:デフォルトの名無しさん
23/01/03 19:10:25.71 aAIqXg3+M.net
標準ライブラリのみで外部依存ありませんは結構な強みになるからな

50:デフォルトの名無しさん
23/01/03 20:16:21.45 Tocwdict0.net
以下の記事、プログラマ脳なら神様の定義の変化を重視するよなあ。あるか、ないかじゃなくて。

【神様はいる? いない?】古代の人々は神をどう考えたのか?(ダイヤモンド・オンライン) - Yahoo!ニュース
URLリンク(news.yahoo.co.jp)

51:デフォルトの名無しさん
23/01/04 00:21:00.82 IaYf77a90.net
懐かしいなboost
みんな直接WG21へ提案持っていくようになってすっかり立ち位置が微妙になっちゃった

52:はちみつ餃子
23/01/04 01:31:15.66 0JWM3k/l0.net
そうか? 言語機能に改定が必要なことならともかく
ライブラリは実績があるほうが通しやすいし、
標準に取り込まれなくても細かな便利機能がある Boost が衰退したとは感じないな。
サードパーティのライブラリを導入する手続きが面倒というのはよくある話だから
そういう面でもカバー範囲が広い Boost の出番は多いんじゃないの。

53:デフォルトの名無しさん
23/01/04 01:55:44.13 gfVJn8560.net
単純に必要な便利機能はあらかたC++標準の方に取り込まれてて
もうマイナーやマニアックな機能かゴミしか残ってないから使う機会なくなったわ
なんかこれ今でも便利だよってのある?

54:デフォルトの名無しさん
23/01/04 02:11:04.13 CtSEqK7p0.net
>>53
他の言語ではとっくの昔に標準化されているXMLやJSONのパーサーが標準化されたら便利になると思うよ

55:デフォルトの名無しさん
23/01/04 02:42:57.82 DBMM4FaV0.net
>54
1.75でBoost.Jsonが入った。

56:デフォルトの名無しさん
23/01/04 03:00:12.42 DBMM4FaV0.net
>>53
Boost.Beast。

57:デフォルトの名無しさん
23/01/04 14:34:57.16 q6K3KMhU0.net
>>53
asioとか標準には入ってないんじゃない?
serializationもたまに使う

58:デフォルトの名無しさん
23/01/04 14:42:05.39 q6K3KMhU0.net
>>53
小物だとlexical_castは便利だけどこれも標準にないのでは?
統計検定するのにMath Libraryの分布関数もちょこちょこ使う

59:デフォルトの名無しさん
23/01/04 18:00:15.11 CtSEqK7p0.net
うっかり標準化して負の遺産になってしまったiostreamでの失敗の知見のうえに今のC++があるってのはわかる

60:デフォルトの名無しさん
23/01/04 18:07:51.27 q6K3KMhU0.net
ところでiostreamに変わるioを作って
標準に入れようという動きはないんですか?

61:はちみつ餃子
23/01/04 18:09:17.48 0JWM3k/l0.net
さすがに入出力の書式化を標準ライブラリとして用意しないわけにもいかんからな。
良いのが出来るまで先送りとは言えないんだからそのとき出来たものを入れるのはしょうがないんじゃないの。

62:はちみつ餃子
23/01/04 18:18:11.23 0JWM3k/l0.net
>>60
私が把握してないけかもしれないけれどストリームの基本構造を変えようという大きな動きはない。
C++20 から書式化 (オブジェクトを文字列表現にする) は std::format として切り出されて、
書式の情報は std::formatter 型で扱うのでグローバルな状態に影響を与えるマニピュレータを使う必要はなくなった。

63:デフォルトの名無しさん
23/01/04 18:26:24.86 CtSEqK7p0.net
「作業ディレクトリ」という概念はプロセス全体でひとつでしたっけ。これはOS依存ですかね。
スレッド処理実行中に作業ディレクトリが変わるのは許容範囲かな

64:デフォルトの名無しさん
23/01/04 18:40:11.15 q6K3KMhU0.net
>>62
へーstd::formatなんてのもあるんですね
ちょっと眺めてみたけどcstdioとも
boost::formantともまた違うようですね

65:はちみつ餃子
23/01/04 18:43:31.27 0JWM3k/l0.net
std::format の設計は Rust の std::fmt::Display と似てる感じがするね。

66:デフォルトの名無しさん
23/01/04 23:47:37.00 PU4coe7B0.net
iostream はよくあんなもん公開する勇気が有ったな

67:デフォルトの名無しさん
23/01/05 00:04:17.98 wM/B2eC00.net
当時はC with Classesなんて研究をしてる人が珍しくて
やってる人のところへ見物に来る人がぞろぞろいたんだよ
禿にとって味方をつくることも大事な仕事で
先行きがまだ見えない試みも怯まず果敢に攻める必要があった
その当時の作品を今さら未来人がドヤ顔で揶揄しても
聞いてるのは当時の人じゃなく同じ未来人だぞ
おまえ自身がどんな批判に晒されるのか怖くないの?
・・・だから匿名掲示板なのか 失笑

68:デフォルトの名無しさん
23/01/05 00:06:22.64 uFuuDD5j0.net
いや、発表当時から微妙な反応だったよ
ユーザーが求めてたのはオブジェクト指向で、
あんな実装じゃない

69:デフォルトの名無しさん
23/01/05 00:11:53.94 wM/B2eC00.net
そういう手前味噌なおも鋳込みが激しいのもこの界隈だわな
おまえさんのようなシュトロハイム型のやつの受け流し方もみんな憶えてる

70:デフォルトの名無しさん
23/01/05 00:12:40.81 wM/B2eC00.net
- おも鋳込み
+ 思い込み

71:デフォルトの名無しさん
23/01/05 00:38:06.59 2y5++O3y0.net
そんなに不満なら何で自分で作らんの?
皆不満なら公開したら支持を集められるよ

72:デフォルトの名無しさん
23/01/05 00:45:23.91 Lgp3gkNr0.net
PowerShellのパイプに似たコレジャナイ感でしょうかね
なお、PowerShellのリダイレクトはさらなる魔改造のために温存されている模様

73:デフォルトの名無しさん
23/01/05 01:10:26.32 TNCZWrQ40.net
std::formatは整数が%d、浮動小数点が%f、文字列が%sのprintfに近い書式でよかったのに…

74:デフォルトの名無しさん
23/01/05 06:48:29.39 O+NRT3S+0.net
>>72
PowerShell のパイプって特に変じゃ無いような気がするが...

75:デフォルトの名無しさん
23/01/05 08:19:32.24 ImmyD00Ud.net
パイプで渡すものがオブジェクトの配列なだけならまだしも、
要素数が0と1の時だけ特別な処理がかかるのは使い勝手を損ねてるだけだぞ

76:デフォルトの名無しさん
23/01/05 11:10:59.66 Cbg+aaE9a.net
>>68
ほんそれ

77:デフォルトの名無しさん
23/01/05 11:12:50.46 Cbg+aaE9a.net
>>75
便所や下水のPipeだね

78:デフォルトの名無しさん
23/01/05 11:14:43.82 l7rjlNbZa.net
>>75
> 要素数が0と1の時だけ特別な処理がかかる
なにそれ?

79:デフォルトの名無しさん
23/01/05 11:46:32.29 wM/B2eC00.net
>>68
発表当時って西暦年で言うといつだ?

80:デフォルトの名無しさん
23/01/05 13:10:14.84 QwpX4kWAM.net
何を今更と思ったけど iostream 叩いとけばわかってる感出るってことなんですかね

81:デフォルトの名無しさん
23/01/05 13:13:50.03 MgmPxFQm0.net
>>80
それはある
実用上困ってないくせに叩いてるバカ多い

82:デフォルトの名無しさん
23/01/05 13:20:30.85 EwWOYZLWM.net
実用上困ったことがない程度しかio使ってないのに養護するバカが他人をバカ呼ばわりして笑える

83:デフォルトの名無しさん
23/01/05 14:03:21.88 XWvG4X+rd.net
実用上どう困るのかを強い説得力で話すやつを見かけないな

84:デフォルトの名無しさん
23/01/05 14:11:12.67 Cbg+aaE9a.net
またperlerが湧いてきたな

85:デフォルトの名無しさん
23/01/05 14:42:05.42 O+NRT3S+0.net
>>83
そりゃ実用上は困らんよ
iostreamなんて使わずに普通にprintfとかでやるし...

86:デフォルトの名無しさん
23/01/05 14:48:29.85 wM/B2eC00.net
へーえ、printfならご満足なのか

87:デフォルトの名無しさん
23/01/05 14:52:05.98 2y5++O3y0.net
マジで不満なら作ったらどうだ? IOくらい余裕でできるやろ?

88:はちみつ餃子
23/01/05 15:00:05.80 ojGp6ksg0.net
printf は型システム的にガバガバすぎるだろ。
書式と実引数が食い違っててもコンパイル時に検出されないこともあるし。

89:デフォルトの名無しさん
23/01/05 15:19:01.89 wM/B2eC00.net
Bの関数をC++スレで持ち出してドヤァ

90:デフォルトの名無しさん
23/01/05 17:25:17.77 sQ9AithNM.net
はちみつはいつもprintfをdisってるが、printfには捨て難い便利さがある。

91:デフォルトの名無しさん
23/01/05 18:01:34.63 sQ9AithNM.net
>>90
補足すれば、cout系はメンドクサイ。書くのが非効率。

92:デフォルトの名無しさん
23/01/05 19:16:41.23 KjlTe/EQ0.net
仕方ないじゃん
当時はいいと思っちゃったんだから
何十年前ものアイデアを今の知見で考察しても仕方がない

93:デフォルトの名無しさん
23/01/05 19:55:51.72 N/v+WbZh0.net
>>78
パイプに流したオブジェクトが
2つ以上なら配列
1つならオブジェクトそのまま
0個ならnull
になってパイプ先に渡る

94:はちみつ餃子
23/01/05 20:56:47.09 ojGp6ksg0.net
>>90
書きやすさは printf のほうがよいというのはわかる。
stream の文法がうっとうしいというのは俺だって思うよ。 それが良いとは思わん。

95:デフォルトの名無しさん
23/01/05 21:36:43.88 O+NRT3S+0.net
>>93
どんなコード書いてるの?
PS C:\> function x {
>> param([parameter(ValueFromPipeline=$true)]$p)
>> begin { Write-Host 'BEGIN' }
>> process { Write-Host "PROCESS: $p" }
>> end { Write-Host 'END'}
>> }
PS C:\> @() | x
BEGIN
END
PS C:\> @(1) | x
BEGIN
PROCESS: 1
END
PS C:\> @(1,2) | x
BEGIN
PROCESS: 1
PROCESS: 2
END
PS C:\>
普通に動いてるけど?

96:デフォルトの名無しさん
23/01/05 21:40:39.42 Lgp3gkNr0.net
iostreamは開発用ログの出力方法としては最適なんだけど、それ以上ではない感じ

97:デフォルトの名無しさん
23/01/05 22:43:53.60 QdQAlRIq0.net
ログ出力用に<<をオーバーロードしたら
バイナリ出力は別の手段を考えることに……
namespaceでオーバーロード内容をさらに区分するとかはできるのかどうか知らんがやりたくない、、、

98:デフォルトの名無しさん
23/01/05 22:50:41.68 Lgp3gkNr0.net
printfだと、見たいオブジェクトの型に気にすることなくログ関数に突っ込む、という他の言語で当たり前にできることができない。

99:デフォルトの名無しさん
23/01/05 23:36:19.07 91BZqTRI0.net
formatのお陰でもう議論する意味なんてないんだが、
17以前は
誰かが状態を書き換えてるかもしれないからいちいち保存と復元が必要、
文字列とコードが入り乱れていて、i18n化できない&何が書かれているかひと目で分からないから
到底実用的じゃない
会社で20が使えるようになったらiostreamに戻るよ…

100:はちみつ餃子
23/01/05 23:43:57.03 ojGp6ksg0.net
>>97
いくつかやり方はあると思うけど……。
同じストリームにログ出力用の表現とバイナリ表現の両方を出力する可能性があるなら
適当なクラスに包むだけでいいと思う。
こんな感じで書ければ十分でしょ。
Foo bar;
std::cout << binary_style(bar) << std::endl;
std::cout << log_style(bar) << std::endl;
Haskell でこんな感じで処理を切り替えるのをよく見た気がする。
だいぶん前にちょっと遊んだだけなのであまり覚えてないけど。

出力先によって表現を変えるのならストリームクラスを定義してしまえばいいと思う。
直接的な入出力はストリームバッファがやっていて、
書式化を担当するストリームがストリームバッファを所有するという構造がある。
オブジェクトの表現形式が大きく変わるとしたら出力先ごとに変えるという用途だろうから
こっちのほうが使い勝手が良い場合も多いかもしれない。
雑な例だけどこんな感じ。
URLリンク(wandbox.org)

101:デフォルトの名無しさん
23/01/06 00:06:44.93 Pn7zd4wpM.net
はちみつは、何かに忖度しているように感じるな。
職人は自分の腕で食っていくので忖度しないが、就職先を探すサラリーマンは忖度する。

102:はちみつ餃子
23/01/06 00:22:08.66 HDVxNHRA0.net
前にも書いたことがあるがワイはプログラミングは完全に趣味でやってるだけなので
プログラミングについて私が配慮すべき何者かなど存在せぇへんで。

103:デフォルトの名無しさん
23/01/06 00:30:02.38 fURAHMja0.net
じゃあ、はちみつ職人に改名しなよ。

104:デフォルトの名無しさん
23/01/06 00:32:36.82 Pn7zd4wpM.net
なんか、何かにおべんちゃらしてるような感じを受ける。

105:はちみつ餃子
23/01/06 00:41:45.62 HDVxNHRA0.net
>>103
職人でもないが、はちみつより餃子のほうが名前として大事なので
もしも職人という言葉を入れて改名するとしたら職人餃子にするわ。

106:デフォルトの名無しさん
23/01/06 05:35:52.57 0M7CqxJ+d.net
NGしやすくていいじゃんよ

107:デフォルトの名無しさん
23/01/06 07:56:26.71 vZ5ptmnXd.net
>>95
@(...)は長さに関わらず強制的に配列にする書き方でしょ

108:デフォルトの名無しさん
23/01/06 14:14:52.53 Zd/Zujyt0.net
>>107
だからどんなコード書いてるのよ?
PS C:\> 1, 2 | x
BEGIN
PROCESS: 1
PROCESS: 2
END
PS C:\> 1 | x
BEGIN
PROCESS: 1
END
PS C:\> | x
発生場所 行:1 文字:1
+ | x
+ ~
空のパイプ要素は許可されていません。
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : EmptyPipeElement
@ なくても特に変な動きとは思えないけど?

109:デフォルトの名無しさん
23/01/06 21:07:55.59 tlJIs+7i0.net
はいそこまで
続きやりたけりゃ↓でな
PowerShell -Part 6
スレリンク(tech板)

110:デフォルトの名無しさん
23/01/09 23:53:42.00 ainDXdRxH.net
すみません拡張子についての質問ですけどここで聞いてもいいですか?
TeraPadでコードを入力し保存したらテキストドキュメントになってしまうのですが
どうやって拡張子を変えたらコマンドブロントと繋がるのでしょうか
すみません初心者なので分かりやすく教えてください
使ってるはwindows11です

111:デフォルトの名無しさん
23/01/10 00:28:45.02 iF453DR40.net
explorerの設定で拡張子を表示しろ
あとコマンドプロンプトのつもりで書いたんだろうけど「繋がる」なんて状況が想像できんので何をしたいか書け

112:デフォルトの名無しさん
23/01/10 00:58:24.28 tyEc5PEMa.net
TeraPad は古いから、新し目の文字コードに対応していないので、サクラエディタを使え
プロは、VSCode, Windows Terminal などを使う

113:デフォルトの名無しさん
23/01/10 02:05:23.85 wl4CEVDPa.net
>>110
繋がるってのがよく分からないけど、バッチを作りたいなら拡張子を表示してから .bat に変更。プログラムを組みたいなら .cp p に変更だけどmakeファイルを書くつもりはないだろうから、VisualStudioを入れよう

114:デフォルトの名無しさん
23/01/10 02:05:51.81 wl4CEVDPa.net
.cpp ね

115:デフォルトの名無しさん
23/01/10 08:11:58.57 j5WRYhpwM.net
>>110
他から指摘されているけど、初心者ならc++用の総合開発環境(IDE)をまずインストールして、IDEの初心者向けガイドをweb で検索して勉強するのが一番良い。
最近のWindowsだとVisual Studio Community Editionが初心者向きかね。

116:デフォルトの名無しさん
23/01/10 08:39:58.49 R5XG+hXYd.net
>>110
保存するときのファイル選択ダイアログで
[ファイルの種類]がテキスト文書になってるんじゃないか?

117:デフォルトの名無しさん
23/01/10 19:07:54.57 0yW4rCRf0.net
C言語の重力付き4目並べです、ここのコードを簡略化したいです。
int SetXpos(int player) // コマの置き場所を入力または探して盤を更新,コマの置き場所(0-6)を返す
{
int xpos = 0; // コマの置き場所
if ((choice == 2 && player == 2) || (choice == 3 && player == 1)) // コンピュータとの対戦の場合に,コンピュータの手を計算
{
xpos = ComputeXpos(player);
printf("%sの番です\n", player == 1 ? "●" : "〇");
printf("コンピュータは%dに置きます\n", xpos);
}
else // 人間の手を選択
{
while (1)
{
printf("%sの番です\n", player == 1 ? "●" : "〇");
printf("どこに置きますか? 0-6の数字を半角で入力してください: ");
scanf_s("%d", &xpos);
if ((0 <= xpos && xpos < XMAX) && (num[xpos] < YMAX)) // 置ける場所かどうか判定
break;
printf("%dには置けません!\n", xpos);
}
}
board[xpos][num[xpos]++] = player;// コマをxpos列に置き,xpos列のコマ数を1増やす
return xpos;
}

118:デフォルトの名無しさん
23/01/10 19:13:34.86 cUqvmTMn0.net
スレタイが読めないのかよ

119:デフォルトの名無しさん
23/01/10 22:47:40.35 g+dbPOkMa.net
>>110
書いたコードをコンパイルしないとコマンドプロンプトには表示できないよ
その辺は入門書かサイトに書いてあると思う
あと繰り返す様で悪いがVisual Stdioを使うのが楽で良い

120:デフォルトの名無しさん
23/01/11 18:38:42.97 867Mv3q20.net
C++、Javaがペラペラなら生きていける。

121:デフォルトの名無しさん
23/01/11 20:16:16.63 tEiwqSvB0.net
今後はWebフロントエンドの技術もできないと生きていけないよ

122:デフォルトの名無しさん
23/01/11 21:38:40.44 pdu3v6T80.net
職探しがよっぽど大変なのね

123:デフォルトの名無しさん
23/01/11 21:58:12.26 dMqhutWk0.net
この先生きのこれるかな?

124:デフォルトの名無しさん
23/01/12 14:41:54.35 74cXnlqp0.net
>>123
キノコれるよ
だって先生だもん

125:デフォルトの名無しさん
23/01/12 14:47:05.06 OEyZMQ5cd.net
エリンギ舞茸ぶなしめじ

126:デフォルトの名無しさん
23/01/13 06:37:30.78 CqT5d+dn0.net
① if ((choice == 2 && player == 2) || (choice == 3 && player == 1))
② if (0 <= xpos && xpos < XMAX && num[xpos] < YMAX)
③ board[xpos][num[xpos]++] = player;
④ for (x = 0, y = ypos, n = 0; x < XMAX; x++)
⑤ for (x = xpos, y = 0, n = 0; y <= ypos; y++)
⑥ for (x = 0, y = ypos - xpos, n = 0; y < YMAX; x++, y++)
⑦ for (x = xpos - ypos, y = 0, n = 0; x < XMAX; x++, y++)
⑧ for (x = 0, y = xpos + ypos, n = 0; y >= 0; x++, y--)
⑨ for (x = xpos + ypos - YMAX + 1, y = YMAX - 1, n = 0; x < XMAX; x++, y--)
の各条件文内でどーゆー計算、アルゴリズムがされてるか教えてくださる人いますか??

127:デフォルトの名無しさん
23/01/13 07:14:01.38 Y56iKvHG0.net
宿題ならまず自分で考えてからどうしても分からない所だけ聞きに来い

128:デフォルトの名無しさん
23/01/13 08:41:01.94 hjGlttN/d.net
宿題スレ行ったら?

129:デフォルトの名無しさん
23/01/13 09:13:11.98 CqT5d+dn0.net
例えば①だと、&&が論理積、||が論理和ということだと思うんですけど、演算子が分かってもその条件文内で何が行われているかとかが分からないので知りたい状態なんです。。

130:デフォルトの名無しさん
23/01/13 09:44:58.05 NX/X2xhta.net
スレリンク(tech板:117番)
スレリンク(tech板:777番)
マルチ死ね

131:デフォルトの名無しさん
23/01/13 11:24:51.74 6wgE5XmR0.net
boostの存在意義ってことでいうと、マルチスレッドの並列ソートboost::sort::block_indirect_sort()が使えるのでLinuxなどは有益
Windowsの場合はVC++にconcurrency::parallel_buffered_sort()があるので使わないけど

132:デフォルトの名無しさん (スプッッ Sdf3-1Rsz)
23/01/13 11:48:47.80 ZURbuhIed.net
>>130
追加
スレリンク(tech板:90番)

133:はちみつ餃子
23/01/13 16:10:50.14 ftt2O/+X0.net
>>129
演算子の意味がわかっているなら分からない箇所なんてないでしょ。
そのような演算が必要になる意図のレベルで知りたいということなら式単体があっても読み取れない。

134:デフォルトの名無しさん
23/01/13 17:16:42.47 DejIUh+t0.net
>126が宿題なら授業で演算子の評価順とか短絡評価とかやっているだろ。
ここで質問する前に授業ノートぐらい確認するなり先生に質問するなりしろよ。

135:デフォルトの名無しさん
23/01/13 18:59:56.28 NgheavAf0.net
払った授業料のためにも教師に聞いとけって

136:デフォルトの名無しさん
23/01/13 19:05:47.85 +0WWfi2gd.net
おまいら
ただのコピペだってのに
親切だな

137:デフォルトの名無しさん
23/01/13 19:38:21.71 4yurTHZ1d.net
マルチ警察は基本アホだから

138:デフォルトの名無しさん
23/01/14 17:02:55.96 oDbFkQuTa.net
普通に単にソートしたい場合はどんなコードになる?
方言なしで

139:デフォルトの名無しさん
23/01/14 17:03:39.93 euxRDNh80.net
std::sortを使う

140:デフォルトの名無しさん
23/01/15 09:58:07.55 /n5l5Pop0.net
同じく
質問の意図がわからんな

141:デフォルトの名無しさん
23/01/15 18:50:51.76 IyvDeUGt0.net
質問なのですがintやdoubleといった単純な型のグローバル変数の初期化タイミングは
グローバルなオブジェクトの初期化タイミングより前であることが保証される?
多分 .dataセクションの初期化はグローバルなオブジェクトの初期化リストの実行より前だと思うんだけど
(そうでなければコンストラクタからC言語のライブラリを安心して呼べないということになる
規格的にそうなん?

142:-w88e)
23/01/15 19:52:54.05 1ER4Wl/40.net
>>141
静的初期化と動的初期化に大別されている。
初期化子が定数 (定数式) のものは静的初期化で、
そうではないものが動的初期化。
静的初期化は動的初期化より先であることは言語仕様で保証される。

143:デフォルトの名無しさん
23/01/16 08:14:19.28 X/jbWDD/M.net
>>141
記憶が確かなら、c++の関数スコープのstatic変数は呼び出し時に初期化されることが保証されているので、初期化順を細かく決める必要がある場合は関数のstatic変数を使う。

144:デフォルトの名無しさん (ワッチョイ 6a28-TTdX)
23/01/16 23:24:41.20 J3mmTfbR0.net
>>142
レス㌧クスだいたいわかりた
この場合のconstexprの扱いがわからん……
ビルド時に定数に展開できたら静的初期化可能な範疇に含まれ得る気がするが
定数に展開で来なかったらどうするんじゃ、という気もする、

>>143
ガチで初期化順序を確実にしたい場合はシングルトンにすることを提唱する。
InterlockerCompareExchange()的なインターロック系の関数を使えばスレッドセーフにできる
(初期化済フラグがfalseならnewに進む、というのをアトミックにやる
関数スコープのstatic変数も似たような実装ではないかと予想、

145:デフォルトの名無しさん (ワッチョイ 6a28-TTdX)
23/01/16 23:26:34.64 J3mmTfbR0.net
訂正orz
×: (初期化済フラグがfalseならnewに進む、というのをアトミックにやる
○: (初期化済フラグがfalseならtrueにする、というのをアトミックにやって、false→trueに変化したときだけnewする

146:デフォルトの名無しさん (ワッチョイ 6a28-TTdX)
23/01/16 23:33:23.86 J3mmTfbR0.net
とオモタがよく考えたら初期化済フラグがfalseならtrueに変化してからポインタpにnewされるまでの間に
別のスレッドが割り込んできてpを使おうとしたら破綻するからpを獲得できるまでスピンロック的に回ることが必要やったorz
ワイの答えはこれや……!

147:デフォルトの名無しさん
23/01/18 09:55:18.36 1kekdbbc0.net
今さらだけどさ、以下Perlソースコードみたいに初期化以外の場所で複数の変数代入を一行で記述できたら楽だよね。
($a, $b) = (1, 2);

148:デフォルトの名無しさん
23/01/18 10:18:29.33 kAps0iiP0.net
>>144
c++11からブロックスコープを持つstatic変数初期化はスレッドセーフだから、手動でやる必要ないんじゃない?

149:デフォルトの名無しさん
23/01/18 12:33:33.72 953Yg8XVM.net
>>147
それ楽なん?

150:デフォルトの名無しさん
23/01/18 12:45:50.93 f+Qa9vK4M.net
パターンマッチングとか単一化が欲しいという話じゃないの?

151:デフォルトの名無しさん
23/01/18 12:49:04.55 aansOABgM.net
複数のことやってんだから複数行で書け
それかそんなにまとまり強いならラップしろ

152:デフォルトの名無しさん
23/01/18 12:57:11.05 953Yg8XVM.net
俺もPerl使ってた頃に初期化で書いたことはあるけど、正直初期化以外での使い道ない気がする
rustのパターマッチは欲しい気がする

153:デフォルトの名無しさん
23/01/18 19:31:01.29 x7mTRTnwa.net
>>147
Perl でできるかは忘れたけどこれで交換できるのは便利
($a, $b) = ($b, $a);

154:デフォルトの名無しさん (ワッチョイ 4a7f-7DGa)
23/01/18 19:47:26.33 ZIWa3HiO0.net
int a, b;
tie(a, b) = tuple(1, 2);
tie(a, b) = tuple(b, a);
一応できなくはない。交換はswap(a, b)でいいけどね

155:デフォルトの名無しさん
23/01/19 20:52:51.98 Np6xvJtm0.net
つauto [a, b] = tuple(1, 2)

156:デフォルトの名無しさん
23/01/19 20:59:17.18 MTxEyC+IM.net
書記か以外って話なんだが……

157:147
23/01/19 21:22:03.00 4HhHC5J20.net
解決方法を探しているんじゃなくて、言語仕様の変更提案なんだけど
改めてPerlだと以下のような感じ
use strict;
my ($a, $b) = ('AAA', 'BBB');
($a, $b) = ('


158:YYY', 'ZZZ');



159:デフォルトの名無しさん
23/01/19 22:28:47.56 j0bW1DQy0.net
>>157
誰得?何得?

160:デフォルトの名無しさん
23/01/19 22:42:23.23 SyYOdr8r0.net
戻り値が1個だけ
どれを戻り値にするかで迷う
この辺はC++の欠点だと思う

161:デフォルトの名無しさん
23/01/19 23:07:21.11 j0bW1DQy0.net
>>159
構造体で戻せばいいですよ、KR2 から構造体の実体というかコピーが返ってきますから、それこそ3個でも4個でもお好きに

162:デフォルトの名無しさん
23/01/19 23:30:55.46 SyYOdr8r0.net
>>160
アホ

163:147
23/01/19 23:36:31.49 4HhHC5J20.net
複数個の変数に対する初期化のワンライナー記述(本当は初期化なので代入ではないが)が許されるなら、再初期化もワンライナー記述できていいと思うんだ

164:デフォルトの名無しさん
23/01/19 23:47:19.80 Np6xvJtm0.net
rvoが働くんだからタプルでも返せばいいのでは?

165:デフォルトの名無しさん
23/01/20 06:46:04.32 2AltcjPFa.net
>>160
このためだけに構造体定義したりするとかアホの極みだろ...

166:デフォルトの名無しさん
23/01/20 07:13:16.62 24yH8jzyd.net
つtuple

167:デフォルトの名無しさん
23/01/20 13:36:18.44 yONvkjD90.net
C++の新しい規格で複数個戻せるっての見た事あるが、気のせいか。

168:デフォルトの名無しさん
23/01/20 14:39:16.65 7GHMGQ2oM.net
うーん、やっぱり初期化以外での使い道がわからん

169:はちみつ餃子
23/01/20 14:46:45.60 FDJF8fJ70.net
>>166
それは >>155 で言及 (?) されている構造化束縛 (structured bindings) のことでしょ。
返却値の数はあくまでもひとつ。
そのひとつを分割して初期値にすることが出来るのであって複数の返却値を返せるわけではない。

170:デフォルトの名無しさん
23/01/20 15:19:11.41 MVRwt7H80.net
戻り値の型推論の規則が厳しいせいでtupleも微妙に使いづらい

171:デフォルトの名無しさん
23/01/20 16:25:40.34 g6yuQGRiM.net
(x, y) = (x+y, y-x)
とか

172:デフォルトの名無しさん
23/01/20 16:26:57.09 yONvkjD90.net
>>168
修行いたします。mOm

173:はちみつ餃子
23/01/20 16:50:23.92 FDJF8fJ70.net
std::tie や std::tuple ってそんなに長い名前でもないし、
C++ のややこしい文法をもっとややこしくしてまで
専用の分割代入の構文が欲しいかな?

174:デフォルトの名無しさん
23/01/20 17:54:27.63 o1hw1lmid.net
いらんよな

175:デフォルトの名無しさん
23/01/20 18:14:48.86 5b5Mr70bd.net
欠点なのは間違いない

176:デフォルトの名無しさん
23/01/20 18:15:46.20 5b5Mr70bd.net
C++は欠点が非常に多い

177:147
23/01/20 18:20:37.41 yyzNyqnf0.net
構造体のメンバ変数の再初期化を一行ですませたい需要、どうかな

178:はちみつ餃子
23/01/20 18:21:31.76 FDJF8fJ70.net
それはそう。

179:はちみつ餃子
23/01/20 18:22:22.62 FDJF8fJ70.net
C++ に欠点が多いのなんてイマサラな話だろ。

180:デフォルトの名無しさん
23/01/20 18:29:58.45 MjTZXIi3d.net
はちみつも欠点が多い

181:デフォルトの名無しさん
23/01/20 19:33:42.78 /4tVg7x40.net
要らないなぁ。
>>176
c++ならコンストラクタを定義するのが定石じゃない?
使い捨ての構造体ならtupleだし。

182:デフォルトの名無しさん
23/01/20 20:55:20.44 HgRp3cSY0.net
再初期化ってのがまず無いかな

183:デフォルトの名無しさん
23/01/20 21:12:53.47 bX3yX62I0.net
代入なら普通にあるね

184:デフォルトの名無しさん
23/01/20 21:59:52.24 vRsHomcy0.net
>>164
単に名前付きタプルが欲しくてもない、というか名前付きタプルは限りなく構造体に近いというだけですよ
新しいものに飛びつく前に K&R2 以来の伝統の重みを評価するべきでしょう、型推論を併用すれば記述量も抑えることができますよ
URLリンク(marycore.jp)

185:デフォルトの名無しさん
23/01/20 22:14:16.78 bK8iHZlj0.net
>>183
で、初期化じゃなくて代入はできるの?

186:デフォルトの名無しさん
23/01/21 00:47:37.77 SJ/UeQbF0.net
>>176
どう書きたいのかいまいち分からん

187:デフォルトの名無しさん
23/01/21 10:30:12.76 PxhUXXTz0.net
>>184
今は >>159 の「複数の引数を返したい」要望に応える手段の話でしょ?
勝手に話題を広げないでね (^^)

188:デフォルトの名無しさん
23/01/21 10:33:35.82 ITn943ohd.net
tieって答え出てるのに気がついてないのかね

189:デフォルトの名無しさん
23/01/21 12:44:01.44 p4hNMN+0d.net
使いにくすぎて使われない

190:デフォルトの名無しさん
23/01/21 13:11:10.71 Wi64nLVza.net
>>186
元々の話は>>147

191:147
23/01/21 14:45:55.24 4IvYDHHD0.net
HOGE構造体インスタンス hogeのメンバfooとbarだけを再設定したい時に、hogeというインスタンス文字列を何度も書かずに済むような仕組みあればいいなあ
HOGE hoge = {0};
do_something(hoge);
hoge.[foo, bar] = [1, 2];

192:デフォルトの名無しさん
23/01/21 15:22:29.46 G9LOOV8U0.net
そういうメソッドを用意するんだよ

193:デフォルトの名無しさん
23/01/21 15:42:11.09 jQCz8FAl0.net
ClassName::enumElementという書き方で列挙体の要素を直接持ってこれるクラスを見かけたんですが
どうやってやってるんですか?
定義見てもよくわかりませんでした

194:はちみつ餃子
23/01/21 15:48:28.56 AnImjWZM0.net
>>192
enum class と enum が別物だってのは知ってる?

195:デフォルトの名無しさん
23/01/21 15:51:00.78 5FsD11Dw0.net
よくわからんがこれのことならenumは外のスコープに漏洩するから出来る
嫌ならenum classにする
class Foo{
public:
 enum{HOGE, FUGA,};
};

int main(){
 std::cout << Foo::HOGE;
}

196:デフォルトの名無しさん
23/01/21 15:52:32.72 SJ/UeQbF0.net
>>192
何を書いているのかいまいち分からん
struct ClassName {
enum {
enumElement
};
};
int main () {
std::cout << ClassName::enumElement << '\n';
return 0;
}

197:デフォルトの名無しさん
23/01/21 20:19:12.82 jQCz8FAl0.net
説明がへたくそですみません
ClassName::EnumName::elementと書かないといけないところを、
途中のEnumNameを省略して使えるようになってます
>>193
普通のenumでした

198:デフォルトの名無しさん
23/01/21 20:30:34.45 2W6/mmpkM.net
普通のenumならEnumName::つかないよ
トップレベルに置いたenumもEnumName::つかないでしょ

199:はちみつ餃子
23/01/21 20:43:48.05 AnImjWZM0.net
>>196
だとしたら enum の列挙子のスコープはその列挙型のスコープと同じになるってだけ。
C のコードを持ってきて C++ でエラーにならないように配慮したんだと思う。

200:はちみつ餃子
23/01/21 20:44:29.11 AnImjWZM0.net
>>198
C の列挙子は C++ と違ってファイルスコープなので C で仕様に適合するものが C++ ではそうなない場合もあるけど……。
たとえばこういうのは C では通るが C++ ではエラー。
#include <stdio.h>
int main(void) {
struct foo { enum bar { baz } qux; };
int n = baz;
printf("%d\n", n);
}

201:デフォルトの名無しさん
23/01/21 22:18:57.09 SJ/UeQbF0.net
>>196
enumとenum classの違いは分かってるんだよね?
#include <iostream>
using namespace std;
struct ClassName {
enum enumElement {element};
enum class enumclassElement {element};
};
int main () {
cout << ClassName::element << '\n'
<< static_cast <int> (ClassName::enumclassElement::element) << '\n';
return 0;
}

202:デフォルトの名無しさん
23/01/21 22:54:59.54 jQCz8FAl0.net
ああなるほど、何もしなくてもC形式のenumなら列挙名省略できるんですね
危険といわれている理由が分かりました
>>200
理解できてなかった😭

203:デフォルトの名無しさん (ワッチョイ 4310-Jpma)
23/01/22 17:51:51.29 mu8Nl5mu0.net
py


204:thonのdecimalで2^256倍精度浮動小数点数の最大値を計算してみた。 https://ideone.com/aCP13Y mpmathで検算もした。(桁数と先頭から千桁程度まで) これらはC++だとどういうプログラムになるの? メモリの容量から全桁の出力や検算は無理だと分かるが、できれば検算して戴きたい。



205:デフォルトの名無しさん (ラクッペペ MM7f-qqxO)
23/01/22 18:33:56.85 vg7X6MkGM.net
IEEE 754で規格化されてる

206:デフォルトの名無しさん (ワッチョイ 4310-Jpma)
23/01/22 18:53:45.43 mu8Nl5mu0.net
>>203
IEEE754準拠での値で計算してみた。
pythonのdecimalのlogでも検算したので多分合っていると思うが、
C++のプログラムだとどのように計算するのかな?という素朴な疑問です。
ideoneのc++だけでできる?
GMPあたりの任意精度パッケージとか必要になるのかな?

207:デフォルトの名無しさん (ワッチョイ 4376-gzmJ)
23/01/22 19:56:25.38 6lZDc9UV0.net
C++標準ライブラリにはないから外部ライブラリに頼ることになる

ideoneがそれ用のライブラリを持ってるか知らんから頑張って探すしかない

208:デフォルトの名無しさん
23/01/22 20:32:22.10 9f7YJXTs0.net
>>204
Boost Multiprecision Libraryあたりからお手軽かね。
他にあったっけ?

209:デフォルトの名無しさん
23/01/22 20:43:06.21 mu8Nl5mu0.net
参考にします。どうもありがとう。

210:デフォルトの名無しさん
23/01/23 02:24:27.76 6OKqnjyz0.net
C++って最初のバージョンはC言語で開発されましたか?
どこかその話のソースありませんか?

211:デフォルトの名無しさん
23/01/23 07:10:57.25 HN6zkKZyd.net
cfrontはC++をCに翻訳するトランスレータ
というのはソースにならんか?

212:デフォルトの名無しさん
23/01/23 08:01:54.02 eLWdsBBpM.net
>>208
「C++の設計と進化」を読め。

213:デフォルトの名無しさん (ワッチョイ fff0-Jpma)
23/01/23 08:27:15.10 ntFDJsM90.net
C言語がC++から派生したというのは本当の話ですか?

214:デフォルトの名無しさん
23/01/23 09:40:42.62 K1n6gQar0.net
>>211
あなたがウソである証拠を示せばいいだけ。他者に証拠を求めてはいけない。

215:デフォルトの名無しさん (ワイーワ2 FFdf-1H6R)
23/01/23 10:00:24.86 6gVuxkoXF.net
polymorphic_allocatorなんでコピーでresource伝播してくれないんだ・・・

216:はちみつ餃子
23/01/23 13:17:00.05 WcsuDU3H0.net
>>211
C が始まったとき (1972 年) に C++ は無い。
C++ の前身である C with Classes の歴史の始まりは 1979 年で、そのときは
C のプリプロセッサとして書かれていたしあくまでも C の拡張と見なされていた。
後に C は C++ からかなり多くを取り入れることになるし
現在進行形で取り入れてもいるが、それを「派生」とは普通は呼ばない。
普通は呼ばないがそこらへんは言葉の定義の問題なので「派生」という言葉の
定義によっては無理すれば派生と呼べなくもないかもね。

217:デフォルトの名無しさん
23/01/23 14:21:27.16 6OKqnjyz0.net
>>209
>>210
CFrontなんてあったのですか
ヒントをありがとうございますた

218:デフォルトの名無しさん
23/01/26 06:18:10.77 nnR+UHRw0.net
名前付き引数標準化への動向って今どうなん
標準化はしないから各自勝手にやってねって感じ?

219:デフォルトの名無しさん
23/01/26 07:48:33.46 XZjGtAvJ0.net
class A{
public:
 void operator () () {...}
};
class B : public A{
 void func(){
  ここでオペレータ()を呼びたいとき、(*this)()としたら呼べますが、this→()では呼べませんでした。
  なぜでしょうか?
 }
};

220:デフォルトの名無しさん
23/01/26 08:02:56.89 HqVXg6xF6.net
>>217
オペレータが左右にとるのは引数でthis->だけだと型が違うから?

221:デフォルトの名無しさん
23/01/26 08:03:37.78 fdXxt+2fM.net
>>217
メソッド名でないから。
確認していないけど this->operator()() かと。

222:デフォルトの名無しさん
23/01/26 09:02:29.12 UDXsjb/60.net
メソッド

223:はちみつ餃子
23/01/26 11:28:53.15 Y60o/Mze0.net
× メソッド
〇 メンバ関数

224:デフォルトの名無しさん
23/01/26 11:34:13.17 EgU8zvdT0.net
さてはDelphiやってたな

225:デフォルトの名無しさん
23/01/26 12:10:18.58 2OqTfEEK0.net
>>219様のやり方でできました皆様ありがとうございます

226:デフォルトの名無しさん
23/01/26 12:11:12.58 2OqTfEEK0.net
すみませんもう一個質問させてください。
template<class T> class A{
public:
 void f(){…}
};
template<class T> class B : public A<T>{
public:
 void g(){f();}
};
というコードがあったとき、g 内の f が undeclared identifier だというエラーが出ますよね?
T が不明だからそうなるのだと説明されてるのを見たのですが、T はコンパイル時には確定してるのになぜダメなのでしょうか。

227:デフォルトの名無しさん
23/01/26 12:18:25.89 epYCai+9d.net
template<>class A<void>{};
のようにf()のない特殊化をされる
可能性があるってことさ

228:デフォルトの名無しさん
23/01/26 12:30:19.94 eBsKw41eM.net
>>224
void g(){A<T>::f();}
かね。理由は知らん。

229:デフォルトの名無しさん (スップ Sd1f-N2va)
23/01/26 13:28:25.80 epYCai+9d.net
SFINAEに使う技

230:デフォルトの名無しさん
23/01/26 14:00:57.20 +VNq3wn00.net
>>226
*this→fとするにしてもA<T>::f()とするにしても長いなあと思ってしまいます
しかたがないので、Bはテンプレートじゃなくても良いように設計し直します

231:デフォルトの名無しさん
23/01/26 14:08:41.08 UQ2YAYq30.net
this->f で済むだろうに、設計を変えるほどのことなのか。

232:デフォルトの名無しさん
23/01/26 14:16:44.11 WpjBlsOj0.net
>>226
それでは>>225のケースでコンパイルできない
void g(){typename f();}
では?

233:デフォルトの名無しさん
23/01/26 14:17:00.65 WpjBlsOj0.net
>>226
それでは>>225のケースでコンパイルできない
void g(){typename f();}
では?

234:デフォルトの名無しさん
23/01/26 20:20:42.59 yE3XErdV0.net
すでに出てるけどA<T>が何者か確定してないので、
(B<int>とかの具体的な型が決まる時ではなく)テンプレート宣言時にエラーになる。
template<class T> class B : public A<T>{
using A<T>::f;
public:
void g(){f();}
};
のように親クラスA<T>にメンバーfがいることを宣言してやればテンプレート宣言自体は通る。

235:デフォルトの名無しさん
23/01/26 22:25:04.25 WpjBlsOj0.net
>>232
>>231

236:デフォルトの名無しさん
23/01/26 23:06:43.67 RzvFLRxY0.net
>>226,232も
>>225のケースで通るよな?

237:デフォルトの名無しさん
23/01/26 23:24:47.70 WpjBlsOj0.net
>>234
わりっ! 通る
勘違いしておった

238:デフォルトの名無しさん
23/01/26 23:24:56.86 WpjBlsOj0.net
>>234
わりっ! 通る
勘違いしておった

239:デフォルトの名無しさん
23/01/27 08:40:23.26 m0DNDaLC0.net
テンプレート引数の取得ってどうやるんでしたっけ?
template<int N = 100> class A{
 ...
};
class B : public A<>{
 ここから N (=100) が見えなくて困ってます。
};

240:デフォルトの名無しさん
23/01/27 08:43:39.83 dyzf+7Sd0.net
Aの中にstatic const int nankanokosuu = N;とか定義しておく

241:デフォルトの名無しさん
23/01/27 08:49:13.97 zx6ru0te0.net
>>237
class B : public A<>{
template <template<int> class T, int N> int func(T<N>*) { return N; }
public:
void test()
{
cout << func(this);
}
};

242:デフォルトの名無しさん
23/01/27 10:58:57.46 IAqgV/bpM.net
>>238
templateって結局
template構文書くより
C言語で直で書いた方が
短くて性能も良いパターンが多い

243:デフォルトの名無しさん
23/01/27 12:06:29.37 RdqQfVtbd.net
性能やリソースと引き換えに楽をする為のものだから

244:デフォルトの名無しさん
23/01/27 12:26:38.33 5C1cxDcZM.net
>>240
std::vectorユーザーが直書きとか不可能だろ。

245:デフォルトの名無しさん
23/01/27 12:32:39.32 RdqQfVtbd.net
丸々作る必要なんか無いんだよ

246:デフォルトの名無しさん
23/01/27 12:35:25.48 RdqQfVtbd.net
小規模組み込みならそもそもnewやdeleteが使えない環境もある
Cより便利な記述が出来るからC++を使うというだけ

247:デフォルトの名無しさん
23/01/27 12:52:45.15 jcVBWYEq0.net
>>240
>>237をC言語で直で書いたらどうなるの?

248:デフォルトの名無しさん
23/01/27 13:48:07.44 a+0fKe/I0.net
>>240-241 テンプレートで性能やリソースを引き換えにすることなんか無いだろ。
・・・コンパイラの処理時間やメモリ消費の話ならあると思うけど、そういう話?

249:デフォルトの名無しさん
23/01/27 13:51:05.37 mIJqx29Ld.net
マジレスすると C++ のテンプレで頑張るより
Nim 使った方が楽だし時間の節約になるよ

250:デフォルトの名無しさん
23/01/27 14:14:37.74 RdqQfVtbd.net
>>246
組み込みのチープな環境のプログラムを組んで見ればわかるよ

251:デフォルトの名無しさん
23/01/27 14:40:15.09 7yNCo9mI0.net
>>240
ヘボなんだね

252:デフォルトの名無しさん
23/01/27 14:50:32.81 MqPTrKVr0.net
コードサイズは確かに増えるだろうが、性能は本当に測ったんか?

253:デフォルトの名無しさん
23/01/27 16:10:15.39 k7iFif1Jd.net
チープな環境ではコードサイズが増えるのは致命的

254:デフォルトの名無しさん
23/01/27 16:17:02.37 a+0fKe/I0.net
>>248
「組み込みのチープな環境」で組んでたことあるけど、心当たり無いよ。
コードサイズだって手書きなりマクロなりでも必要量は同じになるだろうし。
何か例でも挙げてみてもらえる?

255:はちみつ餃子
23/01/27 16:29:51.65 B8oMym/70.net
>>246
テンプレート自体が実行性能の足を引っ張るってことはないが
個々の場面でより性能よく書けるはずのときに汎用部品で済ましてしまうってことはあるんじゃない?
そういうときでも個々の箇所をいじるよりは特殊化を足すだけで済むほうが楽だと思うが。

256:デフォルトの名無しさん
23/01/27 16:34:12.21 k7iFif1Jd.net
同じ結果になるように書けばそりゃ同じだろう
テンプレートで楽をすればコードは(一般的には)増える
memcpyで済む物が
型別にコードが発生したり
そういう所を気にすると結局楽が出来ない

257:デフォルトの名無しさん
23/01/27 16:37:07.22 k7iFif1Jd.net
>>253
全て特殊化したら楽が出来ない
手間が増えるだけ

258:デフォルトの名無しさん
23/01/27 16:40:41.26 k7iFif1Jd.net
10種類のテンプレート引数で使うコードは
基本的には10個のバイナリが生成される
10種類手で書けば
当然コードの共通化を(人間が)考える

259:はちみつ餃子
23/01/27 17:11:02.52 B8oMym/70.net
>>255
必要なとき、効果があるときというのは当然の前提やが。
早すぎる最適化は諸悪の根源。 雑に書いて動くようになってから必要に応じてチューニングするもんやで。

260:デフォルトの名無しさん
23/01/27 17:18:26.40 k7iFif1Jd.net
>>257
リッチな環境前提の発想
初めから考えないといけないチープな環境もある

261:デフォルトの名無しさん
23/01/27 17:22:03.06 6glVv8Ll0.net
Embedded C++やってろ

262:デフォルトの名無しさん
23/01/27 17:22:16.96 7yNCo9mI0.net
非力なハードで無理目なことをギリ勝負でやるときはアセンブラだろ

263:デフォルトの名無しさん
23/01/27 17:22:48.21 k7iFif1Jd.net
実際PC用コードの多くは組み込みでは全く使えず
ほとんどゼロからの開発になる

264:デフォルトの名無しさん
23/01/27 17:24:10.47 k7iFif1Jd.net
>>260
もちろん必要ならアセンブラも使うが
CやC++による最適化が先

265:デフォルトの名無しさん
23/01/27 17:24:25.29 6ZIN/roZ0.net
そういう環境ってそもそも標準ライブラリ揃ってなかったりしない?このスレで扱う必要ある?

266:デフォルトの名無しさん
23/01/27 17:25:27.76 k7iFif1Jd.net
>>263
標準ライブラリのスレではないから

267:デフォルトの名無しさん
23/01/27 17:32:21.49 k7iFif1Jd.net
ぬるま湯環境しか知らないはちみつ
もう少し視野を広げた方が良いかと

268:デフォルトの名無しさん
23/01/27 17:50:48.85 7yNCo9mI0.net
なんかやたらマウント取りたがるな

269:デフォルトの名無しさん
23/01/27 17:55:50.00 6ZIN/roZ0.net
学校でC++03教えてそう(笑)

270:はちみつ餃子
23/01/27 18:01:40.26 B8oMym/70.net
ワイは Z80 時代を生きたおじさんやぞ。
いまどきチープな組み込みでも最初からそんなカリカリにチューニングするのはそんなにないやろ。
無いとは言わんけど C++ の利用例としては例外的やわ。

271:デフォルトの名無しさん
23/01/27 18:16:51.47 tKRPgB5dd.net
カリカリチューンとぬるま湯コーディング
はちみつの頭の中はどっちかしか存在しないのかよ

272:デフォルトの名無しさん
23/01/27 18:24:03.96 7yNCo9mI0.net
人のことを小馬鹿にするだけなやつ出てけよ
プログラム技術の話の邪魔だ

273:デフォルトの名無しさん
23/01/27 18:25:43.08 ESaqgTdPd.net
>>249が書いても説得力ゼロ
私は>>240でもないんだけど

274:デフォルトの名無しさん
23/01/27 18:28:51.80 7yNCo9mI0.net
は? 俺は技術の話をしている
途中で根拠も挙げずに変なことを言うやつにチクリとやったが
貴様と違いそれだけじゃねえんだよボケ

275:デフォルトの名無しさん
23/01/27 18:30:54.17 cYktn2Sdd.net
根拠あるじゃん

276:デフォルトの名無しさん
23/01/27 18:31:53.95 cYktn2Sdd.net
おれがいくつか書いた

277:デフォルトの名無しさん
23/01/27 18:32:25.20 7yNCo9mI0.net
どこにだよ
しどろもどろな返事だなスカタン

278:デフォルトの名無しさん
23/01/27 18:33:01.59 cYktn2Sdd.net
日本語読めない人かな?

279:デフォルトの名無しさん
23/01/27 18:38:13.74 7yNCo9mI0.net
ないものは示せないもんな
せいぜいそんな言い訳にもなってないことを勝手にぬかしてろ
俺はこれから夕飯作らにゃならんし害虫が出てくのを待つ意味でもしばらく落ちる

280:はちみつ餃子
23/01/27 19:53:44.64 B8oMym/70.net
>>269
文脈見ろ。 それは >>265 に対して言ってんだぞ。

281:デフォルトの名無しさん
23/01/27 19:59:17.27 RxpK1TrS0.net
10種類とかで肥大するのはテンプレートなのにデカい関数作るからやろ
共通化できる部分は型に依存しない箇所だからテンプレートだろうと外に出せる

282:デフォルトの名無しさん
23/01/27 22:01:21.69 GkVPt6s00.net
>>270
それお前やろ

283:デフォルトの名無しさん
23/01/27 22:06:41.58 rBkTgp9F0.net
www

284:デフォルトの名無しさん
23/01/27 22:15:36.78 y5pwToDP0.net
孤独のグルメじゃないけど「こういうのでいいんだよ」が最適解なこと多いよな、C/C++

285:デフォルトの名無しさん
23/01/27 22:37:05.53 kTII8Zcn0.net
あまりゴチャゴチャさせずにシンプルイズベストよな

286:デフォルトの名無しさん
23/01/27 22:40:45.09 Tnyv3fMqM.net
C++20 のビューとやらを使ってみてるんだがデバッガで見づらすぎるのどうにかならん?

287:デフォルトの名無しさん
23/01/27 23:34:33.68 qVpyYaSyM.net
>>237
template<int N = 100> class A{
 static int nnn{N};
};
とすると、
A<123>::nnn が 123 になるはず。
static を付けない場合は、インタンスオブジェクトに対して取得できる。

288:デフォルトの名無しさん (ワッチョイ 0b01-Z6M9)
23/01/28 15:20:49.48 x4SDzju+0.net
これは>>239が面白いな

289:デフォルトの名無しさん
23/01/28 15:29:40.57 ys7yM/+j0.net
>>286
ありがとう
誰も反応しなくてつまらんかった

290:デフォルトの名無しさん
23/01/28 15:40:35.35 x4SDzju+0.net
>>238
constexprの方が良いのかな?
static constexpr int nankanokosuu = N
>>285
constかconstexprかが必要
それはさておき初期化の位置に使っている中括弧 {N} はなに?

291:デフォルトの名無しさん
23/01/28 16:15:40.82 gfTDhobA0.net
単に初期化で使ってるだけでしょ
今回はintであることが明白だから=でも()でも{}でも初期化できるけど
この手のコンパイル時に決まるやつはstatic constexpr一択だね
array<T, nankanokosuu> a;みたいに他のテンプレート引数に使える

292:デフォルトの名無しさん
23/01/28 16:18:27.56 TUmaQinN0.net
constexprにするとコンパイル時に解決出来ない項目は弾かれてしまうからconstのままでいい
知らないなら余計な修正は加えるな

293:デフォルトの名無しさん
23/01/28 16:50:45.80 x4SDzju+0.net
>>290
>>237のケースではtemplate引数のNを受けるのだから
コンパイル時に決まっているのでは?
コンパイル時に決まっていることが含意された
constexprの方が良いと思うけど?

294:デフォルトの名無しさん
23/01/28 17:08:38.28 1oumyOI/M.net
>>288
>それはさておき初期化の位置に使っている中括弧 {N} はなに?
C++11位から導入された初期化の一種。
a{N}は、a = N とほぼ同じだが、縮小変換をしないということや、
「どんな場所でも必ず使える」特徴があると言われており、Stroustrup氏
は、= よりも {} を推奨している。
また、{} による初期化は「直接初期化」と関係が深く、= による初期化は
「代入初期化」と関係が深い。

295:デフォルトの名無しさん
23/01/28 22:18:12.18 x4SDzju+0.net
>>292
なるほどC++11以降なのね
「縮小変換」「直接初期化」「代入初期化」がよく分からんが

296:デフォルトの名無しさん
23/01/28 23:35:50.70 JY7EfERdM.net
>>293
「直接初期化(direct initialization)」とも関係しているが、
{}による初期化は、「一様初期化 (uniform initialization)」
で検索すると出て来やすい。
なお、ネットでdirect initializationを検索しても間違った定義が出てくるかも知れない。

297:デフォルトの名無しさん (ワッチョイ 0b01-Z6M9)
23/01/29 00:27:43.05 2zmXfTjk0.net
>>294
なるほど「直接初期化」と{}による初期化(= [一様初期化])は分かった
[一様初期化] URLリンク(cpprefjp.github.io)
[直接初期化] URLリンク(learn.microsoft.com)
「縮小変換」と「代入初期化」が分からん
「代入初期化」は=による初期化のことを言ってるのかな?

298:デフォルトの名無しさん (スップ Sd5a-VuUV)
23/01/29 12:04:49.28 l1ZINGQtd.net
C++17のcopy elisionでルール変わったね

299:デフォルトの名無しさん
23/01/29 13:42:04.03 uP7zelejM.net
>>295
正しい定義かどうかは分からないが、一応、
「直接初期化」「コピー初期化」については、英語版の en.cppreference.com
をそれぞれ
「direct initialization」「copy initialization」
で検索すると「パターン」一覧が出てくるみたいだ。
ただし、一覧については「全てのパターン」かは定かではない。
例えば、direct initialization については、一覧には、new T(XXX) しか出てないが、
new T{XXX} でも良いハズ。

300:デフォルトの名無しさん
23/01/29 13:47:49.42 uP7zelejM.net
>>297
URLリンク(en.cppreference.com)
T object ( arg );
T object ( arg1, arg2, ... ); (1)
T object { arg }; (2) (since C++11)
T ( other )
T ( arg1, arg2, ... ) (3)
static_cast< T >( other ) (4)
new T(args, ...) (5)
Class::Class() : member(args, ...) { ... } (6)
[arg](){ ... } (7) (since C++11)
[説明]
* (5)は、() しか出てないが、{} でも可能 :
new T(args, ...) (5)
new T{args, ...} (5')
* (3) も、() しか出てないが、{} でも可能で恐らくother でなくてもいい筈だ(定かではない) :
T ( other )
T ( arg )
T ( arg1, arg2, ... ) (3)
T { other }
T { arg }
T { arg1, arg2, ... } (3’)

301:デフォルトの名無しさん
23/01/29 13:56:42.30 uP7zelejM.net
>>295
>「縮小変換」と「代入初期化」が分からん
>「代入初期化」は=による初期化のことを言ってるのかな?
縮小変換は、検索すると出てくる。
「代入初期化」という言葉は、俺の記憶違いだったらしく、「コピー初期化」
が正しかったようだ。難しい。

302:デフォルトの名無しさん
23/01/29 14:05:48.45 uP7zelejM.net
ここが分かり易いかな:
「Is it direct-initialization or copy-initialization?」
URLリンク(stackoverflow.com)

303:デフォルトの名無しさん
23/01/29 20:57:42.75 2zmXfTjk0.net
>>299,300
なるほど「縮小変換をしない」とは
例えば以下でエラーになるってことね
int a {1.0};
「コピー初期化」ってのはコピーコンストラクタを呼ぶ初期化
あるいはコピーコンストラクタ自体のことで良いのかな?

304:デフォルトの名無しさん
23/01/29 23:00:33.52 JRnzhQFiM.net
>>301
>「コピー初期化」ってのはコピーコンストラクタを呼ぶ初期化
>あるいはコピーコンストラクタ自体のことで良いのかな?
個人的には、
CPerson::CPerson( CPerson const &rPeson )
の形式のコンストラクタがコピーコンストラクタで、
それを使う初期化がコピー初期化、と思って今まで生きてきたが、
それだと、「直接初期化」の対比の意味のものとは違っているように思える。
どこかで、言葉の混乱が起きているかも。
分からない。

305:デフォルトの名無しさん
23/01/29 23:11:23.60 JRnzhQFiM.net
>>302
一部の例外を除いては、「コピー初期化」とは、= が書いてある初期化で、
「直接初期化」とは、= が書いて無い初期化、だといわれている。
但し、沢山例外があって、
T x = T(a);
などは、直接初期化なんだそうだ。
また、return a などは、コピー初期化、なんだそうだ。
記憶に頼っているので間違っているかも知れない。

306:デフォルトの名無しさん
23/01/29 23:20:25.89 ppqTPlns0.net
コピコンか代入か明示するためのexplicitよ

307:はちみつ餃子
23/01/30 01:17:26.91 kRDQpz8S0.net
>>302
コンストラクタはどれも直接初期化に使えるコンストラクタだけど
一定の形式を満たすものはコピー初期化の文脈「でも」使えるってだけ。
>>303
> T x = T(a);
> などは、直接初期化なんだそうだ。
これについて形式的にはあくまでもコピー初期化の一種ということになる。
URLリンク(timsong-cpp.github.io)
その上でコピーの省略が起きて結果的には直接初期化と同じ挙動になる。
URLリンク(timsong-cpp.github.io)

308:デフォルトの名無しさん
23/01/30 16:11:51.36 S2+yDPxmM.net
記憶に頼って書くけど、
1. 1つの引数を持つコンストラクタは、explicit修飾することが推奨されている。
2. explicit指定が無いと、そのつもりは無い「ひょんな場所」で勝手に変換コンストラクタとして
 利用されてしまうことがある。特に関数に引数を渡す場合に起き易いらしい。
3. CPerson::CPerson( CPerson &rPerson ) は、同じ型を単純にコピーする
 コンストラクタであるから、そもそも型の変換はしないので変換コンストラクタでなく、
 「コピー・コンストラクタ」と言われる。
4. つまり、CPerson::CPerson( AAA &rAAA ) のような場合に

309:デフォルトの名無しさん
23/01/30 16:18:21.06 S2+yDPxmM.net
>>306
[誤送信してしまった。スマソ]
4. つまり、CPerson::CPerson( AAA const &rAAA ) や CPerson::CPerson( int &rX )
 のような場合に explicit 指定することが推奨されていたと思う。
T x = T(a);
の場合、「C++のからくり」のような昔の解説書だと、最適化に任されているのではなく、
特別処理されているようなニュアンス(?)で、T x(a) と同じだと書いてあった。
もし、特別処理されてないと考えた場合、= の部分だけに着目すれば、T::T( T const &rX ) という
コピーコンストラクタの呼び出しと意味論的には考えて考えられなくも無い。
そうするとそこは「変換コンストラクタ」ではなく「コピーコンストラクタ」が使われることになる。
コピーコンストラクタはいくら使っても速度が遅くなる以外は劣化やデータの変化が無いため
無害と言えば無害。なので、explicit が付いていてもいなくても余り関係が無いような気がする。

310:デフォルトの名無しさん
23/01/30 16:24:16.09 S2+yDPxmM.net
>>307
[補足]
void f(T x);
に対して、
U a;
f(a);
と書くと、実引数aが仮引数xに渡される時の動作は、「コピー(?)初期化」と考えられて
いる。もしかしたら言葉は正しく無いかもしれないが、少なくとも「直接初期化」には
分類されないということ。
そしてexplicitが付いて無いコンストラクタは、このような初期化に対しては用いられ
ないことが保証されると書いてあったと思う。

311:デフォルトの名無しさん
23/01/30 16:25:22.84 S2+yDPxmM.net
>>308
[訂正]
誤: そしてexplicitが付いて無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
正: そしてexplicitが付いている無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。

312:デフォルトの名無しさん
23/01/30 16:26:12.39 S2+yDPxmM.net
>>309
[再訂正]
誤: そしてexplicitが付いている無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
正: そしてexplicitが付いているコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。

313:デフォルトの名無しさん
23/01/30 16:50:51.20 S2+yDPxmM.net
>>304
explicit指定の主な役割は、変換コンストラクタにexplicit修飾しておくことで
「変換コンストラクタが知らず知らずのうちに勝手に使われてしまう事」
を防げる、ということだったと思う。

314:デフォルトの名無しさん
23/01/30 16:53:41.85 BI3s5DYMd.net
regexやthreadのexplicitが邪魔

315:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-fO7+)
23/01/30 17:25:41.99 kRDQpz8S0.net
>>306
explicit を付けることは推奨されているわけじゃない。
推奨している人もいるけど普通は必要に応じて使い分けるよ。
明らかに変換を意味しないようなコンストラクタになっちゃうこともあるから気を付けろという程度の話。

たとえば vector は size_t を受け取るコンストラクタがある (指定サイズ分の大きさになる) がそれには当然 explicit が付いてる。
整数が vector に変換されるのは明らかにおかしいから。
char* から string への変換みたいな自然な変換では困らないし、あるほうが便利。

>>307
> 特別処理されているようなニュアンス

かつてはその場合はコピーの省略が許される (しなくてもよい) という仕様だった。 (今の仕様だとコピーの省略が必須。)
コピーコンストラクタは必ずしもコピーをするだけではなくなんらかの副作用を引き起こしても良いので
コピーの省略の有無によってプログラムの意味が変わってしまう。
プログラムの意味を変えない範囲で処理系が行う通常の「最適化」とは異なるという意味では特別扱いだ。

316:デフォルトの名無しさん (ワッチョイ b7f4-+rQD)
23/01/30 17:35:07.72 c/LsY66H0.net
難しいなぁ。。。
ubuntu の g++って 11.1以降だから、c++23だったのね。
すご って思いました。

317:デフォルトの名無しさん
23/01/30 19:37:46.73 BI3s5DYMd.net
C++2bはまだドラフトだよ

318:デフォルトの名無しさん
23/01/30 20:58:31.18 rMqdSurOM.net
>>313
>たとえば vector は size_t を受け取るコンストラクタがある (指定サイズ分の大きさになる) がそれには当然 explicit が付いてる。
>整数が vector に変換されるのは明らかにおかしいから。
>char* から string への変換みたいな自然な変換では困らないし、あるほうが便利。
なるほど。そうだったのか。
勉強になりました。

319:デフォルトの名無しさん
23/02/02 23:34:11.97 Ce1dvKO2a.net
C++やるとどんな言語も使えるとか言うけどNode.jsも数時間あれば使いこなせるの?
あれは言語じゃないでしょって言われそうだがjavascriptともhtmlとも違くて別言語に思えるんだけど

320:デフォルトの名無しさん
23/02/02 23:52:01.04 zSdJjx9q0.net
誰が言ってるの?
こっちでやるべきだと思うぞ
スレリンク(tech板)

321:デフォルトの名無しさん
23/02/03 00:10:02.14 GSbNqAeQ0.net
C++出来ます‼ってのはC言語上がりのなんちゃってチャソも含まれるから一概には言えない

322:はちみつ餃子
23/02/03 00:27:17.07 cvg0vFRY0.net
>>317
C++ を使っていれば低レイヤの事情やシステム全体の関連を知る機会があるし、
言語処理系がどう実装されるのか (低レイヤの視線から見てどう動くのか) を知っていれば
常識的な言語デザインの感覚がわかる。 (言語仕様を類推しやすい。)
C++ を使いこなしている状況からなら色々と理解しやすいという効果がないとは言えない。
ただ、あくまでも C++ を使いこなせるようになる過程で言語自体以外にも身につくことがあるという部分が効いてくるので
C++ の言語仕様の知識はそれほど役に立つわけではないし、さすがに数時間で Node.js を使いこなせるということはない。

323:デフォルトの名無しさん
23/02/03 00:44:48.46 7WbTLk8Ha.net
quoraとか知恵袋とかブログで「Cの次はC++をやればオブジェクト指向身について更にCから派生した言語が主流だからどんな言語も直ぐ理解できる」みたいなの多いよ
だからこのスレの人達ならNode.jsも余裕なのかなって
>>320
学ぶ過程の色んな経験が生きるって事か。そりゃそうだよね

324:はちみつ餃子
23/02/03 01:31:41.47 cvg0vFRY0.net
>>321
JavaScript は C 風の外観を持ってこそいるけど動的型、かつ、プロトタイプベースであるという点で
根本的に異なるメカニズムなわけでこういうのを「C から派生」と呼んでよいのかどうか……。

325:デフォルトの名無しさん
23/02/03 07:32:32.82 gaR1XNY40.net
よく使う言語と比べて在るもの無いもの違うわけで
ちゃんと理解しようとしたらそれなりに時間がかかるでしょ
気軽に使いこなすとか言葉にしてると怖いおじさんに怒られるぞ

326:デフォルトの名無しさん
23/02/03 08:03:03.43 HPBiMoRp0.net
そもそも理解しやすいと使いこなせるは別の概念やろ

327:デフォルトの名無しさん (ワッチョイ e76b-N2mU)
23/02/03 09:08:55.43 b6b2xU8/0.net
vector<int>& a = c, b = c;
としたときに、bがcの参照になりませんでした。
&が後ろにかかるからかと思って
vector<int> &a = c, &b = c;
としても結果が変わりませんでした。
vector<int> &a = c;
vector<int> &b = c;
とすればやっと期待通りの動作になりました。
参照の宣言と初期化は複数をカンマで区切って一行で書くことは不可能なのでしょうか?

328:デフォルトの名無しさん (ワッチョイ 83da-lkW6)
23/02/03 09:24:27.07 GSbNqAeQ0.net
え?コンパイラなに使ったの?
> vector<int> &a = c, &b = c;
> としても結果が変わりませんでした。
処理系ぶっ壊れてんのかな

329:デフォルトの名無しさん
23/02/03 12:28:10.97 31rfnruOM.net
c言語スレで質問したのですが
スレ違いとのことでしたので
改めて質問致します。
c言語の標準入出力ストリームの
本当に基本的なことなんですが
わからずに困っています。
教えてください。
std::ofstream stream;
ostream << "ABCEFG";
この入力した文字列の"ABCEFG"を
右側3文字を削除して"ABC"にするには
どうすれば良いのでしょうか?

330:デフォルトの名無しさん
23/02/03 12:36:10.39 l5lsJ9Ru0.net
カーソルをEのところに持ってきてDeleteキーを3回押す
またはカーソルをGの右の"の上に移動してBSキーを3回押す

331:デフォルトの名無しさん
23/02/03 13:21:17.85 cQeyOYIBM.net
>>327
質問の意味が分かりにくい。
それだと入力ではなく出力になっている。
出力したものを取り消すのは基本的に難しい。

332:デフォルトの名無しさん
23/02/03 13:24:04.52 cQeyOYIBM.net
>>329
[補足]
std::string str = "文字列";
の場合、
str.substr(開始位置, 取り出す長さ);
で部分文字列を作れるので、
std::string str = "ABCEFG";
の場合、
std::string str2 = str.substr(0, 3);
で str2 に "ABC" が入る。

333:デフォルトの名無しさん (ラクッペペ MM4f-zLlH)
23/02/04 10:43:22.05 amDpu8JYM.net
>>330
回答ありがとうございます。

あれから自分でも調べて
seekp()でファイル内位置を移動するなど
試してみたのですがうまくいきませんでした。
(修正の方向はあっていると思うのですが・・)
やはり>>330さんの言う通り、テキストの削除は難しくする
何かわかりませんがそういう思想があるみたいに感じました。

そこで自分も細かい編集は別に改めて行って
結果をまとめてstreamに出力する方法に切り替えました。
結果はOK、どうもありがとうございました。

tstring_t str = _T("ABCDEFG");
str.erase(str.size() - 3);
stream << str;

334:デフォルトの名無しさん (ワッチョイ 4f01-hyUu)
23/02/04 11:10:24.50 e1OBQ9Uv0.net
>>331
それは環境依存の機能だと思う
UNIXだとmmapとか?

335:デフォルトの名無しさん (アウアウウー Sa93-fxZT)
23/02/04 11:41:36.65 9C/WLP1pa.net
>331
seekp seekg
tellp tellg
読み込み用と書き出し用でポインタが二つあるので
自分で思ってるのと違う場所になってるのかも
方向性はあってるはず
間違ってたらすまん子

336:デフォルトの名無しさん
23/02/04 14:37:50.00 cBqi3lSD0.net
>結果をまとめてstreamに出力する
これで済むなら、これこそが正道
必要のない出力をして後から切り詰めるなんて愚の骨頂
そうしなきゃならない理由があるならしょうがないけど

337:デフォルトの名無しさん (スッププ Sd5f-340S)
23/02/04 16:23:00.83 12Q26erYd.net
>>331
テキストじゃなくてファイルの削除でしょ
そういう細かい言い間違いが多いから伝わりにくい文章になってると思う
ファイルに出力する前にメモリー上で編集済ますのは当たり前でファイルアクセスにはメモリよりも時間がかかるから
そういった基本を知ってたほうがいいプログラムを作れるよ

338:デフォルトの名無しさん
23/02/04 17:43:09.03 amDpu8JYM.net
>>335
いやファイルじゃなくてテキストですよ
右側3文字を削除って書いてるじゃないですか
何かの病気・・?


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