次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
C++相談室 part139
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ f65b-zn+7)
2018/10/06(土) 00:59:48.54ID:CdYUXXMG0736デフォルトの名無しさん (ワッチョイ 05eb-WCtl)
2018/12/20(木) 23:32:09.33ID:Lef4v1AJ0 俺はラムダ式は認めんぞ
737デフォルトの名無しさん (ワッチョイ f5d7-ESEE)
2018/12/20(木) 23:35:27.42ID:mxfZwT1A0 ラムダ式なんてものがあるんですね
知らなかった。。
知らなかった。。
738デフォルトの名無しさん (ワッチョイ 037e-q1e7)
2018/12/20(木) 23:46:51.76ID:P+SDVgfX0 ラムダ式使わない奴はNGだわ
739デフォルトの名無しさん (ワッチョイ ade3-u0Vw)
2018/12/21(金) 00:39:41.69ID:JoOPbSrC0740デフォルトの名無しさん (ワッチョイ cbeb-pJxC)
2018/12/21(金) 00:49:34.51ID:kHtIL9Hb0 なにか書くよりはとりあえず[&]って書いといた方が良いと思う
741デフォルトの名無しさん (ワッチョイ 457f-q1e7)
2018/12/21(金) 00:57:46.38ID:8z6lrJJh0 必要ないなら何も書くなよ
742デフォルトの名無しさん (ワッチョイ cbeb-pJxC)
2018/12/21(金) 01:08:05.95ID:kHtIL9Hb0 よく分からないまま書いて、使えないー、コピーされてるーとか言うことになるよりはトラブル少ないかと思った
必要ないなら空はその通りだと思う
必要ないなら空はその通りだと思う
743デフォルトの名無しさん (ワッチョイ bd7b-5YD5)
2018/12/21(金) 04:24:29.96ID:z0fETMsD0 キャプチャーが空のラムダ式は関数オブジェクトと互換性があるので、可能ならインライン展開も行われたりするから、必要ないなら書かない方がいい。
744デフォルトの名無しさん (ワッチョイ ade3-u0Vw)
2018/12/21(金) 15:04:45.84ID:JoOPbSrC0 C++って、「関数オブジェクト」ってあるんだっけ?
745デフォルトの名無しさん (スップ Sd43-odIk)
2018/12/21(金) 15:09:53.69ID:SQCtvUnrd C++で言う所の関数オブジェクトはoperator()をオーバーロードしたクラスのオブジェクトであって、それは大昔からある
お前さんが思い浮かべてるカッコで括ったそれと同じものかどうかは知らん
お前さんが思い浮かべてるカッコで括ったそれと同じものかどうかは知らん
746デフォルトの名無しさん (ワッチョイ ade3-u0Vw)
2018/12/21(金) 15:12:43.01ID:JoOPbSrC0747デフォルトの名無しさん (ワッチョイ c5f2-5YD5)
2018/12/21(金) 22:35:22.62ID:SVNbSsFy0 じゃあ「関数オブジェクト」という名前で呼ばれるものがC++に存在するかという質問?
748デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/21(金) 22:37:25.80ID:Co0MMJAt0 #include <stdio.h>
class Hoge {
int m_x;
Hoge(int x) : m_x(x) { }
int operator(int a, int b) const { return a + b + m_x; }
};
int main() {
int X = 10;
Hoge hoge(X);
int c = hoge(2, 3);
printf("c=%d\n", c); // 15
}
class Hoge {
int m_x;
Hoge(int x) : m_x(x) { }
int operator(int a, int b) const { return a + b + m_x; }
};
int main() {
int X = 10;
Hoge hoge(X);
int c = hoge(2, 3);
printf("c=%d\n", c); // 15
}
749デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/21(金) 22:39:05.01ID:Co0MMJAt0 キャプチャがあるからインライン展開されない、というのは
C++におけるラムダ式の存在意義を半否定している
と思ったり
思わなかったり…
C++におけるラムダ式の存在意義を半否定している
と思ったり
思わなかったり…
750デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/21(金) 22:42:29.52ID:Co0MMJAt0 ちなhoge[&X]の場合の伝統的な関数オブジェクト版はこういったカンジになるヨカン↓↓↓
#include <stdio.h>
class Hoge {
int& m_x;
Hoge(int x) : m_x(x) { }
int operator(int a, int b) const { return a + b + m_x; }
};
int main() {
int X = 10;
Hoge hoge(X);
int c = hoge(2, 3);
printf("c=%d\n", c); // 15
X = 20;
int c2 = hoge(2, 3);
printf("c2=%d\n", c2); // 25
}
#include <stdio.h>
class Hoge {
int& m_x;
Hoge(int x) : m_x(x) { }
int operator(int a, int b) const { return a + b + m_x; }
};
int main() {
int X = 10;
Hoge hoge(X);
int c = hoge(2, 3);
printf("c=%d\n", c); // 15
X = 20;
int c2 = hoge(2, 3);
printf("c2=%d\n", c2); // 25
}
751デフォルトの名無しさん (ワッチョイ cb80-5YD5)
2018/12/22(土) 00:09:01.87ID:b6CiPLFa0 バカほど新しもの好き
752デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/22(土) 00:11:23.62ID:lj97J/9W0753デフォルトの名無しさん (ワッチョイ bd7b-5YD5)
2018/12/22(土) 02:02:20.62ID:NPmZd5n00 関数オブジェクトって言わないのかな、良くしらんがw
つまり、
auto f1 = [](int x){ retrurn x;}
auto f2 = [&](int x){ reutrn x; }
この場合、f1の型は通常の関数ポインタ、f2の型はstd::functionになるということ。
つまり、
auto f1 = [](int x){ retrurn x;}
auto f2 = [&](int x){ reutrn x; }
この場合、f1の型は通常の関数ポインタ、f2の型はstd::functionになるということ。
754デフォルトの名無しさん (アウアウウー Sac9-zV84)
2018/12/22(土) 02:05:38.24ID:DIzquj+Ya f1もf2も型不明じゃなかった?
755デフォルトの名無しさん (ワッチョイ bd7b-pJxC)
2018/12/22(土) 02:21:53.10ID:NPmZd5n00 不明というか、auto以外で受けるのを禁止されているだけで、内部的にはちゃんと型を持ってるでしょ。
たとえば、
void hoge(auto func(int x)->int)
{
.....
}
こういう関数を作ったとして、f1は引数に渡せるけど、f2はエラーになるし、
f2を渡そうと思ったら、std::functionで受ける必要がある。
たとえば、
void hoge(auto func(int x)->int)
{
.....
}
こういう関数を作ったとして、f1は引数に渡せるけど、f2はエラーになるし、
f2を渡そうと思ったら、std::functionで受ける必要がある。
756デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/22(土) 02:36:35.21ID:lj97J/9W0757デフォルトの名無しさん (ワッチョイ cbeb-pJxC)
2018/12/22(土) 02:43:48.49ID:6gYvZ8/20 >>753
f1は同じシグネチャの関数ポインタに暗黙変換可能、であるだけで型自体はコンパイラ依存のラムダ式の型
f1は同じシグネチャの関数ポインタに暗黙変換可能、であるだけで型自体はコンパイラ依存のラムダ式の型
758756 (ワッチョイ 05bd-4M5M)
2018/12/22(土) 02:47:42.19ID:lj97J/9W0 スマンf2はテンプレート引数で渡せば良いは撤回
普通にf1を引数渡ししてインライン展開を気体するものでだいたい合ってるはず…
普通にf1を引数渡ししてインライン展開を気体するものでだいたい合ってるはず…
759デフォルトの名無しさん (ワッチョイ 8dc3-d5oK)
2018/12/22(土) 06:27:13.75ID:K2b4MxYI0 関数ポインタに変換できるのはqsortとか昔のインターフェースに渡すのに便利なだけで
今から書くコードで積極的に使うもんじゃない
今から書くコードで積極的に使うもんじゃない
760デフォルトの名無しさん (ワッチョイ bd7b-pJxC)
2018/12/22(土) 09:28:59.71ID:NPmZd5n00 関数ポインタとstd::functionじゃ実効コストが全然違うから、用途によって選べば良い。
qsortみたいな用途だったら、新しく書くコードでも関数ポインタが適していると思うけどね。
qsortみたいな用途だったら、新しく書くコードでも関数ポインタが適していると思うけどね。
761デフォルトの名無しさん (ワッチョイ 8dc3-d5oK)
2018/12/22(土) 10:10:26.54ID:K2b4MxYI0 比較関数を動的にとっかえひっかえするんじゃなかったら全く適してないぞ
762さまよえる蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd43-NaUf)
2018/12/22(土) 10:15:50.91ID:Op/4E6E/d インライン展開のできるstd::sortが最速なんじゃ。
763デフォルトの名無しさん (アウアウウー Sac9-zV84)
2018/12/22(土) 13:40:32.94ID:DIzquj+Ya 関数ポインタよりstd::functionの方が遅いんじゃないの?
764さまよえる蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd43-NaUf)
2018/12/22(土) 14:28:59.21ID:Op/4E6E/d https://stackoverflow.com/questions/16729941/are-stdfunctions-inlined-by-the-c11-compiler
std::functionよりテンプレートの方が早いみたいだね。
std::functionよりテンプレートの方が早いみたいだね。
765デフォルトの名無しさん (ワッチョイ 1bcd-EJDH)
2018/12/22(土) 15:14:07.07ID:+oRc8mMV0 ポインタはどう頑張ってもポインタだが関数オブジェクトならインライン展開される可能性がある
766デフォルトの名無しさん (ワッチョイ 95b3-lUk2)
2018/12/23(日) 11:18:27.58ID:AQ4G8Wg10 クロージャみたいなものと、
関数の静的型チェック、自発的なメモリ管理
って恐ろしく相性悪いと思われる。
そんな無理するくらいならおとなしく継承、オーバーライド使った方がマシ。
関数の静的型チェック、自発的なメモリ管理
って恐ろしく相性悪いと思われる。
そんな無理するくらいならおとなしく継承、オーバーライド使った方がマシ。
767デフォルトの名無しさん (ワッチョイ 95b3-Kal0)
2018/12/23(日) 13:14:37.02ID:zy+sQveZ0 キャッシュミスを許さない会。
768デフォルトの名無しさん (ワッチョイ c5f2-5YD5)
2018/12/23(日) 13:27:07.40ID:swCrUp5Z0 静的型チェックとクロージャの相性が悪いところってたとえばどんな?
769デフォルトの名無しさん (ワッチョイ ade3-u0Vw)
2018/12/23(日) 17:41:57.71ID:Wgmswpxd0 最近、QueryPerformanceCounter() を使って色んな速度測定をしていたら、
32バイトくらいの memcpy() でも、数マイクロ・セカンド位(1.0*10^(-6)(s))かかる事が分かった。
ちなみに、1クロックは、3.3 * 10^(-10) 位なので、たった32バイトに1万クロックくらいかかって
いる事が分かった。
ためしに単純な for ループと DWORD *ptr で転送してみても結局、それ位の
小さなサイズだと、同じくらいかかることも判明。
同じマシンでも、もっと大きなサイズのコピーだと、for ループで行っても、
1回のループで、4クロックくらいしかかからない。
推測だが、jmp 命令は、10バイト程度前の番地に戻る程度でも、ループ回数が
少ない場合は、物凄く極端に遅いが、ループ回数が多くなるとなんと1クロックで
実行できるようになるらしい。
ただし、余り定かではない。
32バイトくらいの memcpy() でも、数マイクロ・セカンド位(1.0*10^(-6)(s))かかる事が分かった。
ちなみに、1クロックは、3.3 * 10^(-10) 位なので、たった32バイトに1万クロックくらいかかって
いる事が分かった。
ためしに単純な for ループと DWORD *ptr で転送してみても結局、それ位の
小さなサイズだと、同じくらいかかることも判明。
同じマシンでも、もっと大きなサイズのコピーだと、for ループで行っても、
1回のループで、4クロックくらいしかかからない。
推測だが、jmp 命令は、10バイト程度前の番地に戻る程度でも、ループ回数が
少ない場合は、物凄く極端に遅いが、ループ回数が多くなるとなんと1クロックで
実行できるようになるらしい。
ただし、余り定かではない。
770デフォルトの名無しさん (ワッチョイ ade3-u0Vw)
2018/12/23(日) 17:45:32.05ID:Wgmswpxd0 それか、QueryPerformanceCounter() の精度の問題かもしれない。
いくらなんでも、32バイトで1万クロックは遅すぎるように思う。
ちなみに、Sleep(1000); とすると、ちゃんと、1.0 (s) と表示されるので、
速度の計算ミスではないはず。
いくらなんでも、32バイトで1万クロックは遅すぎるように思う。
ちなみに、Sleep(1000); とすると、ちゃんと、1.0 (s) と表示されるので、
速度の計算ミスではないはず。
771デフォルトの名無しさん (ワッチョイ ade3-u0Vw)
2018/12/23(日) 17:57:02.41ID:Wgmswpxd0 そうか、これは、RDTSC 使ってないのか・・・。
「高分解能」と言っても、1.0 マクロセカンド位の精度だったとは、予想外・・・。
「高分解能」と言っても、1.0 マクロセカンド位の精度だったとは、予想外・・・。
772デフォルトの名無しさん (ワッチョイ 95b3-o5ET)
2018/12/23(日) 19:37:24.93ID:V9dsb1PW0 スレッドのディスバッチ、キャッシュのヒットミス、パイプラインストール、バスのI/O待ち、etc…。
memcpy1つとってもそうそう単純なものではない。
memcpy1つとってもそうそう単純なものではない。
773デフォルトの名無しさん (ワッチョイ 95b3-lUk2)
2018/12/23(日) 19:56:30.39ID:AQ4G8Wg10 >>768
引数がどんな型を持つ関数を渡すかを事前にどこで決めるかが問題だし、
それ事前に決められるならクロージャーの必要性は低くなるだろ。
あと資源解放のタイミングをどうするかを明示させるシンタックスってのは多分相当難しい。
その辺、クロージャーを用意する言語は普通はGCに任せる。
引数がどんな型を持つ関数を渡すかを事前にどこで決めるかが問題だし、
それ事前に決められるならクロージャーの必要性は低くなるだろ。
あと資源解放のタイミングをどうするかを明示させるシンタックスってのは多分相当難しい。
その辺、クロージャーを用意する言語は普通はGCに任せる。
774デフォルトの名無しさん (ワッチョイ c5f2-5YD5)
2018/12/23(日) 20:38:33.04ID:swCrUp5Z0 クロージャって関数とその外側の環境を合わせたものだろ。
「関数を渡す」って何がどこに関数を渡す話なんだろうか。
「関数を渡す」って何がどこに関数を渡す話なんだろうか。
775デフォルトの名無しさん (ワッチョイ 95b3-lUk2)
2018/12/23(日) 21:40:29.80ID:AQ4G8Wg10 色々シチュエーションは考えらるだろうけれどreactなら
var ChildInput = React.createClass({
_onChange: function (e) {
this.props.onChange(e.target.value);
}
}
)
とかするやつをイメージしてる。
var ChildInput = React.createClass({
_onChange: function (e) {
this.props.onChange(e.target.value);
}
}
)
とかするやつをイメージしてる。
776デフォルトの名無しさん (ワッチョイ 95b3-aRw3)
2018/12/23(日) 22:50:15.98ID:zy+sQveZ0 キャッシュミスは犯罪です。
777デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/23(日) 23:48:12.36ID:UknIutZS0778デフォルトの名無しさん (ワッチョイ c5f2-5YD5)
2018/12/24(月) 00:09:16.83ID:MCFE6K0T0779はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)
2018/12/24(月) 01:08:30.96ID:+hyoXfJx0 C++ のラムダ式は関数オブジェクト生成の構文糖でしかないので、
従来と比べて特に良くなったり悪くなったりするわけはない。
オブジェクトの寿命の管理がやりづらいってのは C++ では今更な話で、
ラムダ式がどうこうとか言ってもしょうがなくない?
従来と比べて特に良くなったり悪くなったりするわけはない。
オブジェクトの寿命の管理がやりづらいってのは C++ では今更な話で、
ラムダ式がどうこうとか言ってもしょうがなくない?
780デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/24(月) 01:17:53.78ID:GJkiS2EE0 >>778
>m_xがその外側の環境だろ
オブジェクトhogeの中に囲い込まれている(キャプチャされたブツである)からちげう
hogeをコピーしたり別の関数に引数渡ししたら付いていくという意味でも外側の環境ではない
>m_xがその外側の環境だろ
オブジェクトhogeの中に囲い込まれている(キャプチャされたブツである)からちげう
hogeをコピーしたり別の関数に引数渡ししたら付いていくという意味でも外側の環境ではない
781デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
2018/12/24(月) 01:47:35.44ID:SeeEk3oh0 >>779
諦めたらそこで終了だよ!!!
諦めたらそこで終了だよ!!!
782デフォルトの名無しさん (ワッチョイ 6d1b-HeWt)
2018/12/24(月) 03:46:32.26ID:6FDZj5qC0 長時間のプログラム終了を手元のスマートフォンで確認したい(メールなど)という願望からそういったプログラムを書きたいんですがさっぱり分かりません
開発環境はvisual studioです
開発環境はvisual studioです
783デフォルトの名無しさん (ワッチョイ cb80-JI52)
2018/12/24(月) 06:57:18.93ID:N0NAok1A0 普通に、Linux コマンドを並べたら、1・2の順番で実行される。
PowerShell でも良い
command_1 ;
command_2 ;
コマンド1 が終わったら、メール送信するなら、
command_1 ;
メール送信 ;
複雑な処理は、コマンド・シェルスクリプトよりも、Ruby などで作る方がよい
PowerShell でも良い
command_1 ;
command_2 ;
コマンド1 が終わったら、メール送信するなら、
command_1 ;
メール送信 ;
複雑な処理は、コマンド・シェルスクリプトよりも、Ruby などで作る方がよい
784デフォルトの名無しさん (ワッチョイ ade3-u0Vw)
2018/12/24(月) 07:58:21.71ID:RySeMjgB0 >>782
今は知らんけど、数年前だったら、メール送信は知識が結構必要だった。
SendMail Transfer Protocol なるものを使うんだけど、それを便利に発行できる
関数なりCUIプログラムがあれば使えるんだけども。
今は知らんけど、数年前だったら、メール送信は知識が結構必要だった。
SendMail Transfer Protocol なるものを使うんだけど、それを便利に発行できる
関数なりCUIプログラムがあれば使えるんだけども。
785デフォルトの名無しさん (ワッチョイ ade3-u0Vw)
2018/12/24(月) 08:02:13.26ID:RySeMjgB0 >>784
Linux だったら、aaa.txt に以下のような内容を書いて、
---------------------------------------
From: my@mail.address (あなたのメールアドレス)
To: foo@example.com
Subject: This is test mail.
(ここに空行を入れる。ここまでがヘッダ。ここから先がボディ)
メールの内容
.(ドットのみの行を入力すると終了)
---------------------------------------
$ sendmail foo@example.com < aaa.txt
とすると後れるらしい。sendmail は、CUI コマンド。
だから、VisualStudio からだと、
system( "sendmail foo@example.com < aaa.txt" );
とすれば、sendmail コマンドが存在しているなら動作する。
Linux だったら、aaa.txt に以下のような内容を書いて、
---------------------------------------
From: my@mail.address (あなたのメールアドレス)
To: foo@example.com
Subject: This is test mail.
(ここに空行を入れる。ここまでがヘッダ。ここから先がボディ)
メールの内容
.(ドットのみの行を入力すると終了)
---------------------------------------
$ sendmail foo@example.com < aaa.txt
とすると後れるらしい。sendmail は、CUI コマンド。
だから、VisualStudio からだと、
system( "sendmail foo@example.com < aaa.txt" );
とすれば、sendmail コマンドが存在しているなら動作する。
786デフォルトの名無しさん (ワッチョイ cb80-JI52)
2018/12/24(月) 08:28:06.03ID:N0NAok1A0 Linux に、mail コマンドある
787デフォルトの名無しさん (ワッチョイ c5f2-5YD5)
2018/12/24(月) 08:57:29.99ID:MCFE6K0T0788デフォルトの名無しさん (ワッチョイ 95b3-lUk2)
2018/12/24(月) 10:01:04.57ID:JYq0MjYj0 >>779
いやだからc++なら継承でメソッドでオーバーライドする方が
わかりやすいし、資源も管理しやすいんじゃない?って話。
他の言語にあるからみたいな理由で合わんもの入れてもなということなんだけど。
いやだからc++なら継承でメソッドでオーバーライドする方が
わかりやすいし、資源も管理しやすいんじゃない?って話。
他の言語にあるからみたいな理由で合わんもの入れてもなということなんだけど。
789デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/24(月) 11:33:35.23ID:GJkiS2EE0 >>787
>結局どういうことを言いたいんだろう。
クロージャ=関数
特に()のオーバーライド(int Hoge::operator()(int a, int b) { ... })までやった場合、
HogeクラスのインスタンスhogeはC++の構文的にも関数同然に機能の呼び出しを行える
(関数オブジェクトとかファンクタとか呼ばれるやつになる
>元の「関数を渡す」って話
クロージャ=関数なのであるから、クロージャを、クロージャを受け取る他の関数またはクロージャに渡すという話、-- (A)
継承を使う場合のsome_typeのベースクラスをsome_typeのベースクラスを受け取る他の関数に渡すことに対応する --(B)
この場合、クロージャを使うやり方に対する継承を使うやり方のデメリットは…
、と静的型チェック周辺の話に持っていくことができるが、その前に(A)や(B)が共通認識になったのか、それとも理解不能なのかどうか確認しておきたい
>結局どういうことを言いたいんだろう。
クロージャ=関数
特に()のオーバーライド(int Hoge::operator()(int a, int b) { ... })までやった場合、
HogeクラスのインスタンスhogeはC++の構文的にも関数同然に機能の呼び出しを行える
(関数オブジェクトとかファンクタとか呼ばれるやつになる
>元の「関数を渡す」って話
クロージャ=関数なのであるから、クロージャを、クロージャを受け取る他の関数またはクロージャに渡すという話、-- (A)
継承を使う場合のsome_typeのベースクラスをsome_typeのベースクラスを受け取る他の関数に渡すことに対応する --(B)
この場合、クロージャを使うやり方に対する継承を使うやり方のデメリットは…
、と静的型チェック周辺の話に持っていくことができるが、その前に(A)や(B)が共通認識になったのか、それとも理解不能なのかどうか確認しておきたい
790デフォルトの名無しさん (ブーイモ MM59-Lq2G)
2018/12/24(月) 12:11:45.35ID:up8qL/8xM デリゲートとクロージャを混同してるって話?
791デフォルトの名無しさん (ワッチョイ c5f2-5YD5)
2018/12/24(月) 12:34:04.96ID:MCFE6K0T0792デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/24(月) 12:42:22.68ID:GJkiS2EE0 デリゲートは、オブジェクトを参照キャプチャするクロージャと同じ
(マルチキャストみたいなおまけ機能もファンクタとして実現したクロージャになら追加できる
ファンクタとしてクロージャする分には型安全性も同等なので、ファンクタとデリゲートは混同上等のはず…
(マルチキャストみたいなおまけ機能もファンクタとして実現したクロージャになら追加できる
ファンクタとしてクロージャする分には型安全性も同等なので、ファンクタとデリゲートは混同上等のはず…
793デフォルトの名無しさん (ワッチョイ 05bd-4M5M)
2018/12/24(月) 12:55:51.01ID:GJkiS2EE0794はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)
2018/12/24(月) 13:03:08.89ID:+hyoXfJx0 >>788
> いやだからc++なら継承でメソッドでオーバーライドする方が
> わかりやすいし、資源も管理しやすいんじゃない?って話。
だからそんなことはないと私は述べてる。
ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
それも一回しか使われないような使い捨てのものをだ。
使い捨てるのならば、別の場所で定義して (名前を付けて) から使うのはまわりくどい。
わかりにくくて管理しづらくなる。
もちろん、場合によってはラムダ式が適さない場合だってある。
そういう場合まで何もかもをラムダ式に置き換えろってんじゃないだ。
ラムダ式が適しているときにラムダ式を使えってだけのことで、しかもそれは案外に多いってことだ。
> いやだからc++なら継承でメソッドでオーバーライドする方が
> わかりやすいし、資源も管理しやすいんじゃない?って話。
だからそんなことはないと私は述べてる。
ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
それも一回しか使われないような使い捨てのものをだ。
使い捨てるのならば、別の場所で定義して (名前を付けて) から使うのはまわりくどい。
わかりにくくて管理しづらくなる。
もちろん、場合によってはラムダ式が適さない場合だってある。
そういう場合まで何もかもをラムダ式に置き換えろってんじゃないだ。
ラムダ式が適しているときにラムダ式を使えってだけのことで、しかもそれは案外に多いってことだ。
795デフォルトの名無しさん (ワッチョイ c5f2-5YD5)
2018/12/24(月) 13:07:57.67ID:MCFE6K0T0796デフォルトの名無しさん (ワッチョイ c5f2-5YD5)
2018/12/24(月) 13:15:42.46ID:MCFE6K0T0797963 (ワッチョイ 05bd-4M5M)
2018/12/24(月) 14:08:48.90ID:GJkiS2EE0 訂正orz
誤: 変数を束縛するしくみ=クロージャ
正: 変数を束縛して作った関数(ただし束縛すべき変数のリストが空のときもある)=クロージャ
型安全な言語なら型安全に、そうでない言語でもそれなりにやっぱクロージャ=関数ェ、
誤: 変数を束縛するしくみ=クロージャ
正: 変数を束縛して作った関数(ただし束縛すべき変数のリストが空のときもある)=クロージャ
型安全な言語なら型安全に、そうでない言語でもそれなりにやっぱクロージャ=関数ェ、
798デフォルトの名無しさん (ワッチョイ 95b3-lUk2)
2018/12/24(月) 18:39:17.08ID:JYq0MjYj0 >>794
>ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
>それも一回しか使われないような使い捨てのものをだ。
ここが自分の感覚と違う。
ラムダ式を使いたい時ってもう少し動的な関数作成に関わる場合という感覚。
単に名前付けを省略したいくらいならどうとでもなると思うし、個人的にはそんな興味ない用途。
>ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
>それも一回しか使われないような使い捨てのものをだ。
ここが自分の感覚と違う。
ラムダ式を使いたい時ってもう少し動的な関数作成に関わる場合という感覚。
単に名前付けを省略したいくらいならどうとでもなると思うし、個人的にはそんな興味ない用途。
799デフォルトの名無しさん (ワッチョイ 8dc3-d5oK)
2018/12/24(月) 20:19:23.43ID:5oUfBIDD0 C++のラムダ式でどうやって動的関数生成なんかやるの?
何かを根本的に勘違いしてるとしか思えない
何かを根本的に勘違いしてるとしか思えない
800デフォルトの名無しさん (アウアウウー Sac9-zV84)
2018/12/24(月) 20:43:50.96ID:NsJUy6rqa 生成と作成は違う・・・
801デフォルトの名無しさん (ワッチョイ 037e-q1e7)
2018/12/24(月) 20:57:22.56ID:xV9Qcj/20 どうやって動的に生成するんだ
802デフォルトの名無しさん (ワッチョイ a3b3-bdUi)
2018/12/24(月) 21:38:45.00ID:SeZ4reQO0 jsのノリをc++に持ち込もうとして、
面倒だってぶつくさ言うやつ定期的に現れるよな
なぜc++使おうとしているのか、自分を見つめ直した方がいいぞ
面倒だってぶつくさ言うやつ定期的に現れるよな
なぜc++使おうとしているのか、自分を見つめ直した方がいいぞ
803デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
2018/12/24(月) 22:54:19.63ID:SeeEk3oh0 Javascriptのほうが速いのにな。
804デフォルトの名無しさん (ワッチョイ ade3-ESEE)
2018/12/24(月) 23:31:10.01ID:RySeMjgB0 >>803
有り得ない。
有り得ない。
805デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
2018/12/24(月) 23:33:25.79ID:SeeEk3oh0 さてはオヌシ、Javascript使ったことござらんな。
806デフォルトの名無しさん (スッップ Sd43-/Sup)
2018/12/24(月) 23:40:50.37ID:osgTLlKWd 何が速いの
807デフォルトの名無しさん (ワッチョイ e35d-ivsE)
2018/12/24(月) 23:56:41.67ID:ckTogqpu0 ガイジやん
808デフォルトの名無しさん (ワッチョイ 23d2-5YD5)
2018/12/25(火) 00:08:46.01ID:66hcSiRr0 new演算子について教えてください。
自分で定義したクラスをインスタンス化してグローバル変数として扱いたいです。
グローバル変数には実体がないといけないと思うのですが、new演算子は
ポインタにしか使えないですよね?
この場合どうしたらいいでしょうか
自分で定義したクラスをインスタンス化してグローバル変数として扱いたいです。
グローバル変数には実体がないといけないと思うのですが、new演算子は
ポインタにしか使えないですよね?
この場合どうしたらいいでしょうか
809デフォルトの名無しさん (ワッチョイ e3a8-9ZqA)
2018/12/25(火) 00:19:05.74ID:wezhkWA50 newなんか使わずそのままグローバル変数として
myclass mc;
とか定義すればよい
myclass mc;
とか定義すればよい
810デフォルトの名無しさん (ワッチョイ 95b3-lUk2)
2018/12/25(火) 00:20:38.06ID:C9xreq1F0811デフォルトの名無しさん (ワッチョイ 037e-q1e7)
2018/12/25(火) 00:27:18.17ID:elDAcQKF0 >>810
wwwwwwwww
wwwwwwwww
812デフォルトの名無しさん (アウアウウー Sac9-zV84)
2018/12/25(火) 00:50:16.50ID:MFQdZUcza 無名関数としてのラムダはないと困る。
813はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)
2018/12/25(火) 00:53:54.64ID:HIPAf7J10 >>810
オブジェクトとクロージャはメカニズム的には似たようなもんだ
という感覚は言語処理系に明るい人の感覚としては元々ある。
C++ にラムダ式が追加される前に書かれたこの記事が面白いよ。
"クロージャとオブジェクトの微妙な関係"
http://www.itmedia.co.jp/enterprise/articles/0703/29/news069.html
JavaScript の「オブジェクト」だって、その内実は環境への操作だ。
つまりはクロージャを基礎にしてオブジェクトに見せているんだから、
その逆をやる言語があったって別に不自然なことではなかろ。
オブジェクトとクロージャはメカニズム的には似たようなもんだ
という感覚は言語処理系に明るい人の感覚としては元々ある。
C++ にラムダ式が追加される前に書かれたこの記事が面白いよ。
"クロージャとオブジェクトの微妙な関係"
http://www.itmedia.co.jp/enterprise/articles/0703/29/news069.html
JavaScript の「オブジェクト」だって、その内実は環境への操作だ。
つまりはクロージャを基礎にしてオブジェクトに見せているんだから、
その逆をやる言語があったって別に不自然なことではなかろ。
814デフォルトの名無しさん (ワッチョイ 23d2-5YD5)
2018/12/25(火) 01:47:45.90ID:66hcSiRr0815デフォルトの名無しさん (ワッチョイ cb80-JI52)
2018/12/25(火) 03:05:41.87ID:hUN0giiJ0 クラス・クロージャは、同じ。
関数・メソッドから、引数渡しでもないのに、外側の変数を参照できるから
Ruby のブロックがクロージャ。
ブロックの外側の変数が参照できる
一方、Ruby の関数は、外側の変数を参照できないから、
JavaScript, Python, PHP よりも、すごい強固
Ruby だけは、クロージャの外に、関数をスコープを作っている。
さらに関数の外側がクラスで、クラスの外側がモジュール
モジュール > クラス > メソッド(関数) > ブロック(クロージャ)
Ruby 独特の構造!
関数・メソッドから、引数渡しでもないのに、外側の変数を参照できるから
Ruby のブロックがクロージャ。
ブロックの外側の変数が参照できる
一方、Ruby の関数は、外側の変数を参照できないから、
JavaScript, Python, PHP よりも、すごい強固
Ruby だけは、クロージャの外に、関数をスコープを作っている。
さらに関数の外側がクラスで、クラスの外側がモジュール
モジュール > クラス > メソッド(関数) > ブロック(クロージャ)
Ruby 独特の構造!
816デフォルトの名無しさん (ワッチョイ 4bf2-q1e7)
2018/12/25(火) 17:51:31.77ID:Twr4vy9N0 エディッタだけで、Visual Studioコンパイル済まで持って行けた。。。
817デフォルトの名無しさん (ワッチョイ 2312-OVaG)
2018/12/25(火) 18:10:25.20ID:Ra4BufOa0 サンタさんがくれた素敵な奇跡。だからその瞬間を宝物にして、書き込みしたくなっちゃうんですね
818はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)
2018/12/25(火) 18:35:59.59ID:HIPAf7J10 恥ずかしいセリフ禁止!
819デフォルトの名無しさん (ワッチョイ f54e-Wbbf)
2018/12/25(火) 18:44:45.00ID:C73Cga6+0 はちみつ餃子さんってC++を使ってる業務に就いてるんですか?
820はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)
2018/12/25(火) 18:50:42.42ID:HIPAf7J10 前にも書いたことあると思うけど、ワイは完全に趣味でやっとる人やで
821デフォルトの名無しさん (ワッチョイ 95b3-lUk2)
2018/12/25(火) 19:33:29.77ID:C9xreq1F0 理解が深まった。ありがとう。
しかし理解すればするほど、c++ならやっぱクラス生成でよくね?って気になるが。
しかし理解すればするほど、c++ならやっぱクラス生成でよくね?って気になるが。
822デフォルトの名無しさん (ワッチョイ 8dc3-d5oK)
2018/12/25(火) 19:48:34.00ID:KqaRCMCm0 クラス生成するのがC++のラムダ式なんだが
823はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)
2018/12/25(火) 21:36:34.76ID:HIPAf7J10 >>821
繰返して述べるが、 C++ のラムダ式は単純なクラスの定義と使用を同時に出来る構文糖でしかない。
何故か「クロージャ」と混同した書き込みがあるが
(もちろんいわゆるクロージャの概念からおおいに影響は受けているのだろうが)
C++ のラムダ式は C++ に新しい概念を導入するものではない。
繰返して述べるが、 C++ のラムダ式は単純なクラスの定義と使用を同時に出来る構文糖でしかない。
何故か「クロージャ」と混同した書き込みがあるが
(もちろんいわゆるクロージャの概念からおおいに影響は受けているのだろうが)
C++ のラムダ式は C++ に新しい概念を導入するものではない。
824デフォルトの名無しさん (アウアウウー Sac9-zV84)
2018/12/26(水) 00:41:02.88ID:qfoPSrF6a c++の属性構文が出来たけどc++17で不明な属性は無視するという規定が出来たからには、コンパイラによっては独自の属性があるの?
825デフォルトの名無しさん (ワッチョイ 4bd7-q1e7)
2018/12/26(水) 06:42:20.48ID:GQqJjkng0 > C++ のラムダ式は C++ に新しい概念を導入するものではない。
これはさすがに言い過ぎ
関数型のリテラルという概念は C++98 にはなかった
だから C++11 になったとき新しく憶えた
既存の概念の組み合わせでできているから
割とすんなり憶えられたけどね
これはさすがに言い過ぎ
関数型のリテラルという概念は C++98 にはなかった
だから C++11 になったとき新しく憶えた
既存の概念の組み合わせでできているから
割とすんなり憶えられたけどね
826デフォルトの名無しさん (ドコグロ MM93-ckn8)
2018/12/26(水) 07:11:59.75ID:Y8+MwfS4M 元々各社の属性指定方法を統一化したものだし
827デフォルトの名無しさん (アウアウウー Sac9-6UAB)
2018/12/26(水) 21:22:57.27ID:qfoPSrF6a VC++で[[deprecated]]使ったら警告じゃなくてエラーになっちゃう。
いやまあ正解なんだけどさ・・・
いやまあ正解なんだけどさ・・・
828デフォルトの名無しさん (ワッチョイ b6d7-SF4R)
2018/12/27(木) 10:07:41.48ID:1rJdmURK0 >>827
ん、cl.exe の 19.16.27024.1 では通るが?
ん、cl.exe の 19.16.27024.1 では通るが?
829デフォルトの名無しさん (アウアウウー Sa39-Rqk6)
2018/12/27(木) 18:09:20.50ID:DLCsZ7Bsa 警告になる?
830デフォルトの名無しさん (ワッチョイ b6d7-SF4R)
2018/12/28(金) 06:03:28.17ID:4iocbykD0 ならない
831デフォルトの名無しさん (ワッチョイ b6d7-SF4R)
2018/12/28(金) 06:04:31.02ID:4iocbykD0 つーか、[[deprecated]]って書いてある関数を使っても警告しないのはつまらない
832デフォルトの名無しさん (ワッチョイ 91e3-h5Ay)
2018/12/28(金) 15:46:17.14ID:50PB7VSs0 Emscripten で、マウスの動きに合わせて JS の canvasに直線を描いたりする
ようなGUIプログラムを作って試していて、local auto 変数に確保した
16バイトの char 配列に、sprintf で色の #RRGGBB の文字列を合成
して JS に渡して canvas の context の style に直線の色を設定していた。
で、同時に、KeyDown イベントでで20文字ほどのグラフィック文字列を出して
いた。なお、そっちの方でも、全く同じ関数を使って、上記の色の文字列
を合成していた。
すると不思議なことに、KeyDownイベントで文字列を書いた後は、
必ず、直線の方の色が変わってしまう。必ず青色で書くようにしているはずなのに。
ログをとってみると、
char szBuf[16];
sprintf(szBuf, "#%02X%02X%02X", r, g, b);
で szBuf に対して、最後の 0終端文字が、書き込まれていないことが判明。
よく見ると、KeyDownイベントで色のためではなく、出力したい
文字列そのものの文字の一部が直線描画の方の szBuf の #RRGGBB の直後に
残ったままコピーされているように振舞っていた。
ためしに、sprintf() の命令の直前に、memset(szBuf, 0, 16); とすると
正常化することも確認した。
Emscripten のライブラリの不具合だろうか?
ようなGUIプログラムを作って試していて、local auto 変数に確保した
16バイトの char 配列に、sprintf で色の #RRGGBB の文字列を合成
して JS に渡して canvas の context の style に直線の色を設定していた。
で、同時に、KeyDown イベントでで20文字ほどのグラフィック文字列を出して
いた。なお、そっちの方でも、全く同じ関数を使って、上記の色の文字列
を合成していた。
すると不思議なことに、KeyDownイベントで文字列を書いた後は、
必ず、直線の方の色が変わってしまう。必ず青色で書くようにしているはずなのに。
ログをとってみると、
char szBuf[16];
sprintf(szBuf, "#%02X%02X%02X", r, g, b);
で szBuf に対して、最後の 0終端文字が、書き込まれていないことが判明。
よく見ると、KeyDownイベントで色のためではなく、出力したい
文字列そのものの文字の一部が直線描画の方の szBuf の #RRGGBB の直後に
残ったままコピーされているように振舞っていた。
ためしに、sprintf() の命令の直前に、memset(szBuf, 0, 16); とすると
正常化することも確認した。
Emscripten のライブラリの不具合だろうか?
833デフォルトの名無しさん (ワッチョイ 91e3-h5Ay)
2018/12/28(金) 16:23:41.67ID:50PB7VSs0 char szCol[16];
memset( szCol, 0, 16 );
memset( szCol, 'W', 10 );
szprintf( szCol, ・・・ );
とした場合は、W の文字が残ったままになることも分かった。
memset( szCol, 0, 16 );
memset( szCol, 'W', 10 );
szprintf( szCol, ・・・ );
とした場合は、W の文字が残ったままになることも分かった。
834デフォルトの名無しさん (ワッチョイ 91e3-h5Ay)
2018/12/28(金) 16:55:00.81ID:bcsUwMQ/0 szprintf() の直後に
szCol[7] = 0;
とすると、正常化することも分かった。
szCol[7] = 0;
とすると、正常化することも分かった。
835デフォルトの名無しさん (ワッチョイ 5ad2-4fyn)
2018/12/28(金) 19:27:07.61ID:NSIH2Vow0 C++でクラスポインタにnewしたオブジェクトを配列の様に複数作りたいのですが、
エラーがでてしまいます。
ポインタの宣言
TimerParameter *_timerParameter;
インスタンス化
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);
TimerParameterコンストラクタ
TimerParameter::TimerParameter(ULONG time, void(*function)(), bool one_loop)
{
_function = function;
_oneLoop = one_loop;
_timeSpan = time;
resetTimer();
}
自分で作ったTimerParameterクラスをnewして_timerParameterメンバに入れると以下のエラーが発生してしまいます
sketch\timerState.cpp: In member function 'bool TimerState::timerSet(long unsigned int, void (*)(), bool)':
timerState.cpp:14:30: error: no match for 'operator=' (operand types are 'TimerParameter' and 'TimerParameter*')
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);
インスタンス化の左辺が適切でないのが原因だと思うのですが、この書き方はダメなのでしょうか?
エラーがでてしまいます。
ポインタの宣言
TimerParameter *_timerParameter;
インスタンス化
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);
TimerParameterコンストラクタ
TimerParameter::TimerParameter(ULONG time, void(*function)(), bool one_loop)
{
_function = function;
_oneLoop = one_loop;
_timeSpan = time;
resetTimer();
}
自分で作ったTimerParameterクラスをnewして_timerParameterメンバに入れると以下のエラーが発生してしまいます
sketch\timerState.cpp: In member function 'bool TimerState::timerSet(long unsigned int, void (*)(), bool)':
timerState.cpp:14:30: error: no match for 'operator=' (operand types are 'TimerParameter' and 'TimerParameter*')
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);
インスタンス化の左辺が適切でないのが原因だと思うのですが、この書き方はダメなのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【熊本】園児に強制性交か 保育所勤務の男を逮捕「性的な欲望が我慢できなかった」警察は余罪を調べる [七波羅探題★]
- 堀江貴文、キャッシュレス非対応の店にモヤッ 『PayPay』立ち上げの人物にまさかの直談判「現金決済しかできないんだけど…」 [冬月記者★]
- 【前橋市】小川晶前市長とラブホテルで打ち合わせをした54歳男性職員を停職処分 今月末で依願退職するという [シャチ★]
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」★3 [ぐれ★]
- 日銀「歴史的」利上げ迫る 35年ぶりの年間上げ幅、0.5%の壁を突破 [蚤の市★]
- 【サッカー】元日本代表DF冨安がオランダ1部アヤックスと大筋合意か 現地メディア報じる [久太郎★]
- 高市早苗「竹島は日本領土」 [834922174]
- 中国の日本向けレアアースの輸出止まる、高市のせいで日本終了のお知らせ [931948549]
- 故・安倍氏「首相の責任の第一義は国家の平和維持では無いでしょうか☺」👈今思うと正しいよな [152212454]
- あくたんのおまんこって甘そうだよな🤤
- 🏡
- 暖房やめて湯たぼんにしようと思ってる
