C++相談室 part139

■ このスレッドは過去ログ倉庫に格納されています
2018/10/06(土) 00:59:48.54ID:CdYUXXMG0
次スレを立てる時は本文の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
2018/12/19(水) 08:34:28.71ID:4vZcLUvu0
通信ライブラリですらいつ策定されるか分からない状態なのにGUIとかC++29くらいになりそう
それに最近はGUIはweb方面のエコシステムを流用するのが流行だしはっきり言って厳しい
2018/12/19(水) 10:09:57.72ID:i1OD7WIV0
GUI ライブラリの提案だけは出てるけどね。
cairo を取り入れようとか、
ウェブアプリケーション風の DOM ベースのやつ (?) とか。

動作モデルが色々とあるので、
どれかに統一するのはしんどいと思う。
ベースの動作モデルを意識させないほど厚いライブラリを
標準に入れるのもちょっとどうかと思うし。
2018/12/19(水) 10:20:42.79ID:G6mG3us50
>>704
そういうのは「言語」かってことだよ
ISO/IEC14882は言語を定義する規格で、
GUIを定義する規格なら別の文書番号になるだろう
OSを定義する規格がそうであるように
2018/12/19(水) 11:42:47.34ID:auFS4SnhM
標準ライブラリは最小限でいい派
標準のスレッドすら不要
大抵結局native handle使うはめになるし
デバッガと連携しないし
一方でatomicは使えるな
2018/12/19(水) 12:28:04.06ID:o9SPlDa00
お酒はぬるめの燗がいい
肴はあぶったイカでいい
2018/12/19(水) 13:04:47.28ID:RjqFkMVC0
質問です。
ノートPCのキーが勝手に連打されるような状態になったので、
「キー入力の連打を感知したら、連打された入力をキャンセルする」というソフトが欲しいのですが、
どこかにあるでしょうか?

無ければ、自作も考えますが、キー入力をキャンセルさせる方法がよくわかりません。
2018/12/19(水) 13:13:01.18ID:4vZcLUvu0
キー入力のイベントをフックしてごにょればできるんじゃないの
2018/12/19(水) 13:24:01.60ID:i1OD7WIV0
>>710
いわゆるチャタリングってことかな。
ざっとググってみた感じだと ccchattttter や Keyboard Chattering Fix というソフトがあるみたいだね。

ソフトウェアとしては、他のプロセスが受け取るイベントを横取りすることになるから、
アプリケーションレベルでやるならフックを仕掛ける (DLL Injection など) か、
あるいはデバイスドライバのレベルでどうにかするという方法も考えられる。
2018/12/19(水) 14:20:16.58ID:RjqFkMVC0
ありがとうございます。

> ccchattttter や Keyboard Chattering Fix
さっそく、試してみました。
これらは、同じキーが連打された場合のみのキャンセルでしょうか?
違うキーが連続で誤入力されたりするので、その場合は対応できないかも?

フックするというのは、どうやるのかわかりませんが、ちょっと調べてみます。
2018/12/19(水) 14:42:07.56ID:Yvire5cb0
https://qiita.com/leon-joel/items/81415c1ef355c6246280

constexpr unsigned N = 10;
std::array<int, N> arr = {{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }};

2行目の 二重の中括弧は何を意味してる?
どう解釈するの?
2018/12/19(水) 15:04:48.65ID:wepwiZF/a
その制限c++14で撤廃してなかったけ(うろ覚え)
2018/12/19(水) 15:27:41.05ID:G6mG3us50
>>710
それキーボードに異物が入ってないか?
かつて俺が面倒見てた客先ではホチキスの針が原因の障害が複数回あったぞ

異物が入っていない正常な状態で起きるチャタリングは
設計の段階でしっかり対策されているはずなので
それまで問題なかったキーボードが突然そういう状態になったのなら
何らかの事故を疑ったほうがいい
717デフォルトの名無しさん (ワッチョイ 9fe3-S6R4)
垢版 |
2018/12/19(水) 15:30:09.30ID:Yvire5cb0
https://www.codesdope.com/cpp-stdarray/


以下の二種類あるらしいけど、何で2.の方は二重括弧になってるの?
外側の括弧の意味、内側の括弧の意味がそれぞれ知りたい。

1. std::array<int, 5> n = {1, 2, 3, 4, 5};
2. std::array<int, 5> n { {1, 2, 3, 4, 5} };
2018/12/19(水) 15:36:10.74ID:7xp8Igl8d
std::arrayのメンバーの初期化リストになってる可能性。
2018/12/19(水) 15:56:47.23ID:G6mG3us50
外側の括弧はコンストラクタへの実引数ならびを囲む
内側の括弧はコンストラクタの仮引数がinitializer_listであることに対応
= は、一時オブジェクトを作ってコピコンかムブコンという意味だったが
C++17でこの意味が廃止され単なる過去の名残となった
2018/12/19(水) 16:12:08.78ID:Yvire5cb0
>>719
つまり、2. の方は、以下の記法の ()を{} に変えただけということ?

3. std::array<int, 5> n ( {1, 2, 3, 4, 5} );

つまり、コンストラクタ名を Xxxx とすれば、
Xxxx( リスト型 &list1 ) {
}

みたいな事になってるということかな。
2018/12/19(水) 16:21:41.32ID:Yvire5cb0
https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00752_source.html

↑ libstdc++ の template struct(?) の array のソースを見てみたら、


// No explicit construct/copy/destroy for aggregate type.

とコメントされていた。明示的なデストラクタが何も無いので、その {・・・}
の部分は、コンパイラが初期化処理まで全部やってるってことなのかも
知れないけど、どういう仕組み?

TYPE _M_instance[N] みたいなメンバがあるけど、ここにコンパイラが初期値を
書き込むんだろうか。どういう仕様なんだろう。
2018/12/19(水) 16:35:50.86ID:Yvire5cb0
まず、以下の 2, 3 のような書き方が出来て、それで array の場合は、
ああなるってことかな。まだよく分からん。

1. CPerson person = CPerson( 25, MALE, "Yamada Taro" );
2. CPerson person = { 25, MALE, "Yamada Taro" };
3. CPerson person { 25, MALE, "Yamada Taro" };
723デフォルトの名無しさん (アウアウカー Sa6b-SUIi)
垢版 |
2018/12/19(水) 16:41:39.76ID:yP9yNdl2a
贅沢なお願いなんですが
OpenGLを使って
注視点を行列で回転させたいのですが
どなたか参考になるサイトやソースが
あれば頂けないでしょうか
2018/12/19(水) 19:25:23.79ID:UC31GMnJ0
>>721
std::arrayはpublicに内部の配列を公開してて、コンストラクタデストラクタを一切書かないことで集成体となって、その初期化は集成体初期化で行う
二重かっこの外側はarrayの初期化、内側のかっこはstd::array内部配列への集成体初期化
ただし、C++14以降は二重かっこを省略できる
https://cpprefjp.github.io/lang/cpp14/brace_elision_in_array_temporary_initialization.html
2018/12/19(水) 20:44:10.56ID:C9bIO99C0
>>692
>バスアーキ
古い8086とかだったら書籍に載っていましたが、最近はどうでしょうか?わけのわからない仕様書しかないのでしょうか?
2018/12/19(水) 23:24:40.75ID:vlvnW3Fh0
PCならPCI Expressだな
2018/12/20(木) 01:57:39.19ID:Gok/GJGq0
>>724
なるほどだんだん分かってきた。
struct CPerson {
int m_dat1[2];
int m_dat2[3];
};
なら、古い C の時代から、確か、
CPerson person = { {1,2}, {3,4} };   // (1)
みたいに書けた。だから、
struct CMyArray {
int m_dat1[5];
};
なら、
CMyArray a = { {1,2,3,4,5} };     // (2)
と書けるのは当然、ってことだよね。それでC++14以降はさらに、
(1)の場合は、全部一列に並べて、
CPerson person = { 1, 2, 3, 4 };   //(1')
と書ける様になった。結果として、(2)も、
CMyArray a = { 1,2,3,4,5 };     // (2')
と書ける様になった。

そういうことだよね、多分。それでさらに、「=」を省略したような書き方も
できると。そういえば昔から、コンストラクタを持つ CPerson の場合に、
1. CPerson person=CPerson(・・・);
2. CPerson person(・・・);
は確か等価で引数つきのコンストラクタが呼び出されるんだった。
そして、新しい C++ では、小括弧 () を、波括弧 {} に書き換えることも
可能になったみたいな話で、
3. CPerson person=CPerson{・・・};
4. CPerson person{・・・};
みたいなことも書けるようになったのかな。
2018/12/20(木) 08:10:15.22ID:qx3kfu0o0
>>727
その通りだと思う
集成体以外で{}を使う初期化を一様初期化と呼ぶそう
https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html
729デフォルトの名無しさん (アウアウカー Sa51-9xJM)
垢版 |
2018/12/20(木) 11:33:42.81ID:pms7BJwLa
贅沢なお願いなんですが
OpenGLを使って
注視点を行列で回転させたいのですが
どなたか参考になるサイトやソースが
あれば頂けないでしょうか
2018/12/20(木) 13:08:35.90ID:zDBAwFJg0
>>729
確か、古くからある OpenGL の場合、GL_XXXX 見たいな定数を指定して、ViewMatrix
見たいなのを設定するんだったはず。
731デフォルトの名無しさん (ワッチョイ 6d23-1q7i)
垢版 |
2018/12/20(木) 13:58:01.82ID:P4Rv6f7s0
>>723
http://www.mss.co.jp/technology/report/pdf/19-08.pdf
http://www.mss.co.jp/technology/report/pdf/18-07.pdf
2018/12/20(木) 14:06:29.86ID:Stk2JPJbp
>>729
スレチ
ここにもゲ製作技術板にもGLスレあるだろ
あとは線形代数の勉強しろとしか

>>730
そんな手順の話じゃないと思うぞ
2018/12/20(木) 14:19:20.62ID:BW/0WCvFM
>>729
スレチ
2018/12/20(木) 23:21:08.79ID:mxfZwT1A0
C++でこんな感じの構文見たんですが、どういったものなんでしょうか?
「const auto 関数名 = [変数名](引数) -> 戻り値の型」
例えば、以下のように書くとcに5が返ります。
int X;
const auto hoge = [X](int a, int b) -> int
{
return a + b;
}
int c = hoge(2, 3);
[X]のところは、宣言してある変数ならなんでもいいみたいですが、何者かよく分かりません。
2018/12/20(木) 23:27:13.41ID:KfVqhHRV0
ラムダ式でぐぐれ
2018/12/20(木) 23:32:09.33ID:Lef4v1AJ0
俺はラムダ式は認めんぞ
2018/12/20(木) 23:35:27.42ID:mxfZwT1A0
ラムダ式なんてものがあるんですね
知らなかった。。
2018/12/20(木) 23:46:51.76ID:P+SDVgfX0
ラムダ式使わない奴はNGだわ
2018/12/21(金) 00:39:41.69ID:JoOPbSrC0
>>734
その[X]は、関数外部の変数 X を関数内部で使えるようにする意味があるらしい。
それを書いておかないと、グローバル変数やクラスのメンバ変数以外は、参照できなく
なるようだ。
2018/12/21(金) 00:49:34.51ID:kHtIL9Hb0
なにか書くよりはとりあえず[&]って書いといた方が良いと思う
741デフォルトの名無しさん (ワッチョイ 457f-q1e7)
垢版 |
2018/12/21(金) 00:57:46.38ID:8z6lrJJh0
必要ないなら何も書くなよ
2018/12/21(金) 01:08:05.95ID:kHtIL9Hb0
よく分からないまま書いて、使えないー、コピーされてるーとか言うことになるよりはトラブル少ないかと思った
必要ないなら空はその通りだと思う
2018/12/21(金) 04:24:29.96ID:z0fETMsD0
キャプチャーが空のラムダ式は関数オブジェクトと互換性があるので、可能ならインライン展開も行われたりするから、必要ないなら書かない方がいい。
2018/12/21(金) 15:04:45.84ID:JoOPbSrC0
C++って、「関数オブジェクト」ってあるんだっけ?
2018/12/21(金) 15:09:53.69ID:SQCtvUnrd
C++で言う所の関数オブジェクトはoperator()をオーバーロードしたクラスのオブジェクトであって、それは大昔からある
お前さんが思い浮かべてるカッコで括ったそれと同じものかどうかは知らん
2018/12/21(金) 15:12:43.01ID:JoOPbSrC0
>>745
>お前さんが思い浮かべてるカッコで括ったそれと同じものかどうかは知らん
特に何も思い浮かべてないけど。
2018/12/21(金) 22:35:22.62ID:SVNbSsFy0
じゃあ「関数オブジェクト」という名前で呼ばれるものがC++に存在するかという質問?
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
}
2018/12/21(金) 22:39:05.01ID:Co0MMJAt0
キャプチャがあるからインライン展開されない、というのは
C++におけるラムダ式の存在意義を半否定している
と思ったり
思わなかったり…
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
}
751デフォルトの名無しさん (ワッチョイ cb80-5YD5)
垢版 |
2018/12/22(土) 00:09:01.87ID:b6CiPLFa0
バカほど新しもの好き
2018/12/22(土) 00:11:23.62ID:lj97J/9W0
スマン>>750訂正orz
誤: Hoge(int x) : m_x(x) { }
正: Hoge(int& x) : m_x(x) { }
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になるということ。
2018/12/22(土) 02:05:38.24ID:DIzquj+Ya
f1もf2も型不明じゃなかった?
2018/12/22(土) 02:21:53.10ID:NPmZd5n00
不明というか、auto以外で受けるのを禁止されているだけで、内部的にはちゃんと型を持ってるでしょ。

たとえば、

void hoge(auto func(int x)->int)
{
.....
}

こういう関数を作ったとして、f1は引数に渡せるけど、f2はエラーになるし、
f2を渡そうと思ったら、std::functionで受ける必要がある。
2018/12/22(土) 02:36:35.21ID:lj97J/9W0
関数オブジェクト==ファンクタ
多分、

>この場合、f1の型は通常の関数ポインタ、
mjk、
>>748に関数ポインタにならずにすむからくりまで示したのに…

>>755
f2はテンプレート引数で渡せば良い
主にそういう目的のブツのはず
2018/12/22(土) 02:43:48.49ID:6gYvZ8/20
>>753
f1は同じシグネチャの関数ポインタに暗黙変換可能、であるだけで型自体はコンパイラ依存のラムダ式の型
2018/12/22(土) 02:47:42.19ID:lj97J/9W0
スマンf2はテンプレート引数で渡せば良いは撤回
普通にf1を引数渡ししてインライン展開を気体するものでだいたい合ってるはず…
2018/12/22(土) 06:27:13.75ID:K2b4MxYI0
関数ポインタに変換できるのはqsortとか昔のインターフェースに渡すのに便利なだけで
今から書くコードで積極的に使うもんじゃない
2018/12/22(土) 09:28:59.71ID:NPmZd5n00
関数ポインタとstd::functionじゃ実効コストが全然違うから、用途によって選べば良い。
qsortみたいな用途だったら、新しく書くコードでも関数ポインタが適していると思うけどね。
2018/12/22(土) 10:10:26.54ID:K2b4MxYI0
比較関数を動的にとっかえひっかえするんじゃなかったら全く適してないぞ
2018/12/22(土) 10:15:50.91ID:Op/4E6E/d
インライン展開のできるstd::sortが最速なんじゃ。
2018/12/22(土) 13:40:32.94ID:DIzquj+Ya
関数ポインタよりstd::functionの方が遅いんじゃないの?
2018/12/22(土) 14:28:59.21ID:Op/4E6E/d
https://stackoverflow.com/questions/16729941/are-stdfunctions-inlined-by-the-c11-compiler

std::functionよりテンプレートの方が早いみたいだね。
2018/12/22(土) 15:14:07.07ID:+oRc8mMV0
ポインタはどう頑張ってもポインタだが関数オブジェクトならインライン展開される可能性がある
2018/12/23(日) 11:18:27.58ID:AQ4G8Wg10
クロージャみたいなものと、
関数の静的型チェック、自発的なメモリ管理
って恐ろしく相性悪いと思われる。
そんな無理するくらいならおとなしく継承、オーバーライド使った方がマシ。
767デフォルトの名無しさん (ワッチョイ 95b3-Kal0)
垢版 |
2018/12/23(日) 13:14:37.02ID:zy+sQveZ0
キャッシュミスを許さない会。
2018/12/23(日) 13:27:07.40ID:swCrUp5Z0
静的型チェックとクロージャの相性が悪いところってたとえばどんな?
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クロックで
実行できるようになるらしい。

ただし、余り定かではない。
2018/12/23(日) 17:45:32.05ID:Wgmswpxd0
それか、QueryPerformanceCounter() の精度の問題かもしれない。
いくらなんでも、32バイトで1万クロックは遅すぎるように思う。
ちなみに、Sleep(1000); とすると、ちゃんと、1.0 (s) と表示されるので、
速度の計算ミスではないはず。
2018/12/23(日) 17:57:02.41ID:Wgmswpxd0
そうか、これは、RDTSC 使ってないのか・・・。
「高分解能」と言っても、1.0 マクロセカンド位の精度だったとは、予想外・・・。
2018/12/23(日) 19:37:24.93ID:V9dsb1PW0
スレッドのディスバッチ、キャッシュのヒットミス、パイプラインストール、バスのI/O待ち、etc…。
memcpy1つとってもそうそう単純なものではない。
2018/12/23(日) 19:56:30.39ID:AQ4G8Wg10
>>768
引数がどんな型を持つ関数を渡すかを事前にどこで決めるかが問題だし、
それ事前に決められるならクロージャーの必要性は低くなるだろ。
あと資源解放のタイミングをどうするかを明示させるシンタックスってのは多分相当難しい。
その辺、クロージャーを用意する言語は普通はGCに任せる。
2018/12/23(日) 20:38:33.04ID:swCrUp5Z0
クロージャって関数とその外側の環境を合わせたものだろ。
「関数を渡す」って何がどこに関数を渡す話なんだろうか。
2018/12/23(日) 21:40:29.80ID:AQ4G8Wg10
色々シチュエーションは考えらるだろうけれどreactなら
var ChildInput = React.createClass({
_onChange: function (e) {
this.props.onChange(e.target.value);
}
}
)
とかするやつをイメージしてる。
2018/12/23(日) 22:50:15.98ID:zy+sQveZ0
キャッシュミスは犯罪です。
2018/12/23(日) 23:48:12.36ID:UknIutZS0
>>774
>クロージャって関数とその外側の環境を合わせたものだろ
それは新たな関数を作ったことになるんじゃー
>>748
> int X = 10;
> Hoge hoge(X);
という部分は、f(a, b) = a + b + 10という関数を作ってゐる
Xを変えることによってg(a, b) = a + b + 9とかh(a, b) = a + b + 8とか
Hogeクラスのクロージャでいくらでもバリエーションを作れる
2018/12/24(月) 00:09:16.83ID:MCFE6K0T0
>>777
>>748で言えばHoge::operator()が関数でm_xがその外側の環境だろ。
そこで関数を渡すとか作るとかあるいは静的型チェックと相性が悪いというのが
どういうことを言っているのかわからん。
関数オブジェクトを作ってるというならわかるけど。
2018/12/24(月) 01:08:30.96ID:+hyoXfJx0
C++ のラムダ式は関数オブジェクト生成の構文糖でしかないので、
従来と比べて特に良くなったり悪くなったりするわけはない。

オブジェクトの寿命の管理がやりづらいってのは C++ では今更な話で、
ラムダ式がどうこうとか言ってもしょうがなくない?
2018/12/24(月) 01:17:53.78ID:GJkiS2EE0
>>778
>m_xがその外側の環境だろ
オブジェクトhogeの中に囲い込まれている(キャプチャされたブツである)からちげう
hogeをコピーしたり別の関数に引数渡ししたら付いていくという意味でも外側の環境ではない
781デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
垢版 |
2018/12/24(月) 01:47:35.44ID:SeeEk3oh0
>>779
諦めたらそこで終了だよ!!!
2018/12/24(月) 03:46:32.26ID:6FDZj5qC0
長時間のプログラム終了を手元のスマートフォンで確認したい(メールなど)という願望からそういったプログラムを書きたいんですがさっぱり分かりません
開発環境はvisual studioです
2018/12/24(月) 06:57:18.93ID:N0NAok1A0
普通に、Linux コマンドを並べたら、1・2の順番で実行される。
PowerShell でも良い

command_1 ;
command_2 ;

コマンド1 が終わったら、メール送信するなら、

command_1 ;
メール送信 ;

複雑な処理は、コマンド・シェルスクリプトよりも、Ruby などで作る方がよい
2018/12/24(月) 07:58:21.71ID:RySeMjgB0
>>782
今は知らんけど、数年前だったら、メール送信は知識が結構必要だった。
SendMail Transfer Protocol なるものを使うんだけど、それを便利に発行できる
関数なりCUIプログラムがあれば使えるんだけども。
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 コマンドが存在しているなら動作する。
2018/12/24(月) 08:28:06.03ID:N0NAok1A0
Linux に、mail コマンドある
2018/12/24(月) 08:57:29.99ID:MCFE6K0T0
>>780
>>774で言っている関数の外側の環境って意味だよ。それがクロージャの中なのは当然。
いいかげん、元の「関数を渡す」って話からずれまくっているが、結局どういうことを言いたいんだろう。
2018/12/24(月) 10:01:04.57ID:JYq0MjYj0
>>779
いやだからc++なら継承でメソッドでオーバーライドする方が
わかりやすいし、資源も管理しやすいんじゃない?って話。
他の言語にあるからみたいな理由で合わんもの入れてもなということなんだけど。
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)が共通認識になったのか、それとも理解不能なのかどうか確認しておきたい
2018/12/24(月) 12:11:45.35ID:up8qL/8xM
デリゲートとクロージャを混同してるって話?
2018/12/24(月) 12:34:04.96ID:MCFE6K0T0
>>789
>クロージャ=関数

そういう前提で言っていたのか?
ID:AQ4G8Wg10は明らかにクロージャと関数を使い分けているようだが。>>766>>773

じゃあそこは了解したとして、(A)(B)の条件の下でもう一度>>768の質問をするよ。
関数の静的型チェックとクロージャの相性が悪いところってたとえばどんな?
2018/12/24(月) 12:42:22.68ID:GJkiS2EE0
デリゲートは、オブジェクトを参照キャプチャするクロージャと同じ
(マルチキャストみたいなおまけ機能もファンクタとして実現したクロージャになら追加できる
ファンクタとしてクロージャする分には型安全性も同等なので、ファンクタとデリゲートは混同上等のはず…
2018/12/24(月) 12:55:51.01ID:GJkiS2EE0
>>891
>関数の静的型チェックとクロージャの相性が悪いところってたとえばどんな?
知らん
>>766はクロージャの実現方法について黒魔術的な何かを想定しているのではないか…
C++におけるクロージャの簡単な実現方法はファンクタ、であって、ファンクタには特に型安全や資源解放に関するファンクタ固有の問題は無いと思う
何しろファンクタは普通のクラスHogeの普通のインスタンスhogeとして>>748風に書けるので…

一方、広義のクロージャは、変数を束縛するしくみ=クロージャなので、型安全という概念をそもそも含まない
この広義のクロージャをC++上で実現しようとしているのだとしたら知らん
2018/12/24(月) 13:03:08.89ID:+hyoXfJx0
>>788
> いやだからc++なら継承でメソッドでオーバーライドする方が
> わかりやすいし、資源も管理しやすいんじゃない?って話。

だからそんなことはないと私は述べてる。

ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
それも一回しか使われないような使い捨てのものをだ。
使い捨てるのならば、別の場所で定義して (名前を付けて) から使うのはまわりくどい。
わかりにくくて管理しづらくなる。

もちろん、場合によってはラムダ式が適さない場合だってある。
そういう場合まで何もかもをラムダ式に置き換えろってんじゃないだ。
ラムダ式が適しているときにラムダ式を使えってだけのことで、しかもそれは案外に多いってことだ。
2018/12/24(月) 13:07:57.67ID:MCFE6K0T0
ああわかった。
>>776ではクロージャと関数を区別して書いていたのに対して、>>777は単に

>クロージャ=関数

と言いたかっただけなんだな。
2018/12/24(月) 13:15:42.46ID:MCFE6K0T0
アンカー間違えた。>>776じゃなくて>>774か。
2018/12/24(月) 14:08:48.90ID:GJkiS2EE0
訂正orz
誤: 変数を束縛するしくみ=クロージャ
正: 変数を束縛して作った関数(ただし束縛すべき変数のリストが空のときもある)=クロージャ

型安全な言語なら型安全に、そうでない言語でもそれなりにやっぱクロージャ=関数ェ、
2018/12/24(月) 18:39:17.08ID:JYq0MjYj0
>>794

>ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
>それも一回しか使われないような使い捨てのものをだ。
ここが自分の感覚と違う。
ラムダ式を使いたい時ってもう少し動的な関数作成に関わる場合という感覚。
単に名前付けを省略したいくらいならどうとでもなると思うし、個人的にはそんな興味ない用途。
2018/12/24(月) 20:19:23.43ID:5oUfBIDD0
C++のラムダ式でどうやって動的関数生成なんかやるの?
何かを根本的に勘違いしてるとしか思えない
2018/12/24(月) 20:43:50.96ID:NsJUy6rqa
生成と作成は違う・・・
2018/12/24(月) 20:57:22.56ID:xV9Qcj/20
どうやって動的に生成するんだ
2018/12/24(月) 21:38:45.00ID:SeZ4reQO0
jsのノリをc++に持ち込もうとして、
面倒だってぶつくさ言うやつ定期的に現れるよな
なぜc++使おうとしているのか、自分を見つめ直した方がいいぞ
803デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
垢版 |
2018/12/24(月) 22:54:19.63ID:SeeEk3oh0
Javascriptのほうが速いのにな。
2018/12/24(月) 23:31:10.01ID:RySeMjgB0
>>803
有り得ない。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。