C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part148
https://mevius.5ch.net/test/read.cgi/tech/1580471646/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
C++相談室 part149
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/02/18(火) 06:19:41.54ID:xvjipUWj764デフォルトの名無しさん
2020/03/07(土) 12:24:15.53ID:CT6knIM5 スペースがちゃんと入ってなく、見づらくて申し訳ないです。
よろしくお願いしますm(__)m
よろしくお願いしますm(__)m
765デフォルトの名無しさん
2020/03/07(土) 12:37:30.49ID:+VsyTV1D こんな自分でやる気のない人にはぜひエサを与えないでほしい。
766デフォルトの名無しさん
2020/03/07(土) 12:39:57.68ID:iUAwzQ87 いや、困ってるみたいだし、書いてやれよ。
俺がケチョンケチョンに添削してやるから。
俺がケチョンケチョンに添削してやるから。
767デフォルトの名無しさん
2020/03/07(土) 12:40:37.61ID:CT6knIM5 やる気がないわけではなくて、勉強しているけどどう書くのか分からないだけです。。
768デフォルトの名無しさん
2020/03/07(土) 12:45:37.23ID:CT6knIM5 C++だと、イメージだけど
test.setListener([](int result)) { print(result); });
みたいにかけそうってのはわかりましたが。。
NULL指定したい時とか複数のoverride対象の
メソッドを並べる書き方とか良く分からず。
test.setListener([](int result)) { print(result); });
みたいにかけそうってのはわかりましたが。。
NULL指定したい時とか複数のoverride対象の
メソッドを並べる書き方とか良く分からず。
769蟻人間 ◆T6xkBnTXz7B0
2020/03/07(土) 13:05:14.05ID:ECZE2b67 class TestListener {
public:
virtual void onSuccess(int result) { }
virtual void onError(int errorCode) { }
};
public:
virtual void onSuccess(int result) { }
virtual void onError(int errorCode) { }
};
770蟻人間 ◆T6xkBnTXz7B0
2020/03/07(土) 13:09:06.48ID:ECZE2b67 class Test {
private:
TestListener *m_listener;
public:
Test() : m_listener(NULL) { }
void setListener(TestListener *listener) {
m_listener = listener;
}
void run() {
if (m_listener != NULL) {
m_listener->onSuccess(0);
m_listener->onError(1);
}
};
private:
TestListener *m_listener;
public:
Test() : m_listener(NULL) { }
void setListener(TestListener *listener) {
m_listener = listener;
}
void run() {
if (m_listener != NULL) {
m_listener->onSuccess(0);
m_listener->onError(1);
}
};
771デフォルトの名無しさん
2020/03/07(土) 13:10:29.44ID:qpmtEUNF772デフォルトの名無しさん
2020/03/07(土) 13:12:54.90ID:0g+cGFce773蟻人間 ◆T6xkBnTXz7B0
2020/03/07(土) 13:13:53.37ID:ECZE2b67 class MyListener : public TestListener {
public:
virtual void onSuccess(int result) {
printf("だから何?\n");
}
virtual void onError(int errorCode) {
printf("100年ROMってろ\n");
}
};
Test test;
MyListener lis;
test.setListener(&lis);
test.run();
public:
virtual void onSuccess(int result) {
printf("だから何?\n");
}
virtual void onError(int errorCode) {
printf("100年ROMってろ\n");
}
};
Test test;
MyListener lis;
test.setListener(&lis);
test.run();
774デフォルトの名無しさん
2020/03/07(土) 13:18:44.05ID:CT6knIM5775772
2020/03/07(土) 13:20:39.61ID:0g+cGFce776デフォルトの名無しさん
2020/03/07(土) 13:20:43.30ID:CT6knIM5 ちょっと試してみます
777デフォルトの名無しさん
2020/03/07(土) 14:15:14.60ID:CT6knIM5 ありがとうございました。
内容は大体理解できたので、今後のテンプレとして使わせていただきます。
助かりました!
内容は大体理解できたので、今後のテンプレとして使わせていただきます。
助かりました!
778デフォルトの名無しさん
2020/03/08(日) 22:16:34.90ID:51E2S4Dp http://codepad.org/4KkPN9ki
上記を実行すると下記結果になります。
[2]を見ると、vectorの3つ目以降はポインタのアドレスがあうのですが、2つ目までは合っていません。
MAPの方にはvectorのポインタを渡しているつもりなので、[2]のアドレスはvectorのアドレスと一致する。
が期待値なのですが、理由はわかりますでしょうか?
[1]
VECTOR ABC 0x144dd20
VECTOR DEF 0x144dd28
VECTOR GHI 0x144dd30
[2]
MAP itr GHI 0x144dd30 ←vectorの3つ目以降はポインタが一致する
MAP itr ABC 0x144dc20
MAP itr DEF 0x144dcc8
[3]
VECTOR for_each ABC 0x144dd20
VECTOR for_each DEF 0x144dd28
VECTOR for_each GHI 0x144dd30
上記を実行すると下記結果になります。
[2]を見ると、vectorの3つ目以降はポインタのアドレスがあうのですが、2つ目までは合っていません。
MAPの方にはvectorのポインタを渡しているつもりなので、[2]のアドレスはvectorのアドレスと一致する。
が期待値なのですが、理由はわかりますでしょうか?
[1]
VECTOR ABC 0x144dd20
VECTOR DEF 0x144dd28
VECTOR GHI 0x144dd30
[2]
MAP itr GHI 0x144dd30 ←vectorの3つ目以降はポインタが一致する
MAP itr ABC 0x144dc20
MAP itr DEF 0x144dcc8
[3]
VECTOR for_each ABC 0x144dd20
VECTOR for_each DEF 0x144dd28
VECTOR for_each GHI 0x144dd30
779デフォルトの名無しさん
2020/03/08(日) 23:05:19.29ID:SIolBUWz emplace_back()の時にvectorのサイズが拡張されて中身が再配置されることがある
そうなると拡張前に取ったポインタは無効になる
嫌だったらvectorの挿入削除が一通り終わってからポインタ取るとか、
必要量でreserve()して再配置されないようにするとか、deque使うとかその辺
そうなると拡張前に取ったポインタは無効になる
嫌だったらvectorの挿入削除が一通り終わってからポインタ取るとか、
必要量でreserve()して再配置されないようにするとか、deque使うとかその辺
780デフォルトの名無しさん
2020/03/09(月) 07:24:49.77ID:50Nkxt/s vector<int> v があるとして、
for(auto i: v)
というループの中で v の要素を変更したときの挙動って言語仕様として決まってるの?
あと、
for(auto i: set<int>(v.begin(), v.end()))
みたいなループを書いたときって set の定義を外に出したときと比べてパフォーマンス上の違いある?
for(auto i: v)
というループの中で v の要素を変更したときの挙動って言語仕様として決まってるの?
あと、
for(auto i: set<int>(v.begin(), v.end()))
みたいなループを書いたときって set の定義を外に出したときと比べてパフォーマンス上の違いある?
781デフォルトの名無しさん
2020/03/09(月) 07:59:37.36ID:kzUaYlzv &
782デフォルトの名無しさん
2020/03/09(月) 08:17:06.64ID:aBhFrWy9 >>780
for(auto e: vec){ statement }
はこんな感じで展開される
{
auto && __range = vec;
for (auto __begin = begin(__range), __end = end(__range); __begin != __end; ++__begin) {
auto e = *__begin;
statement
}
}
ポイントとしては内部でイテレータを使ってるからイテレータ無効化ルールに抵触したらおかしな動きになる
(ループの中でvec.push_back()をするとか)。
二つ目の質問については、上の例の
auto && __range = vec;
のように最初に定義域を右辺値参照で取ってるからsetの定義を外に出す必要はない
for(auto e: vec){ statement }
はこんな感じで展開される
{
auto && __range = vec;
for (auto __begin = begin(__range), __end = end(__range); __begin != __end; ++__begin) {
auto e = *__begin;
statement
}
}
ポイントとしては内部でイテレータを使ってるからイテレータ無効化ルールに抵触したらおかしな動きになる
(ループの中でvec.push_back()をするとか)。
二つ目の質問については、上の例の
auto && __range = vec;
のように最初に定義域を右辺値参照で取ってるからsetの定義を外に出す必要はない
783はちみつ餃子 ◆8X2XSCHEME
2020/03/09(月) 10:20:22.51ID:CscrLobz >>778
vector のイテレータが無効になる条件。
https://ja.cppreference.com/w/cpp/container/vector#.E3.82.A4.E3.83.86.E3.83.AC.E3.83.BC.E3.82.BF.E3.81.AE.E7.84.A1.E5.8A.B9.E5.8C.96
emplace_back の場合はそれを実行した後の size() が capacity() より大きいときにイテレータが無効になる。
https://ja.cppreference.com/w/cpp/container/vector/emplace_back
vector は要素が必ず隣接したアドレスに配置されるというルールなので
連続したアドレスで拡張することが出来なければ再配置することがある。
C で言うところの realloc みたいなこと。
要素の数が増えるような操作はだいたいイテレータを無効にすると覚えておけばいい。
vector のイテレータが無効になる条件。
https://ja.cppreference.com/w/cpp/container/vector#.E3.82.A4.E3.83.86.E3.83.AC.E3.83.BC.E3.82.BF.E3.81.AE.E7.84.A1.E5.8A.B9.E5.8C.96
emplace_back の場合はそれを実行した後の size() が capacity() より大きいときにイテレータが無効になる。
https://ja.cppreference.com/w/cpp/container/vector/emplace_back
vector は要素が必ず隣接したアドレスに配置されるというルールなので
連続したアドレスで拡張することが出来なければ再配置することがある。
C で言うところの realloc みたいなこと。
要素の数が増えるような操作はだいたいイテレータを無効にすると覚えておけばいい。
784デフォルトの名無しさん
2020/03/09(月) 22:02:02.24ID:0hJmIbuo785デフォルトの名無しさん
2020/03/09(月) 22:50:43.87ID:yYcTR1n2 inlineについて質問です。
ttps://qiita.com/omuRice/items/9e31d9ba17b32703b3b1
上記を見ると下記のように書いてあります。
//ヘッダファイルでしかinlineで定義できない
//別ファイルで書くとinline展開の時にエラーになる.
しかしヘッダファイルではなく、クラスの本体ファイルの方に書いてもエラーになりませんでした。
c++11を使っているのですが、最新ではエラーになるということでしょうか?
ttps://qiita.com/omuRice/items/9e31d9ba17b32703b3b1
上記を見ると下記のように書いてあります。
//ヘッダファイルでしかinlineで定義できない
//別ファイルで書くとinline展開の時にエラーになる.
しかしヘッダファイルではなく、クラスの本体ファイルの方に書いてもエラーになりませんでした。
c++11を使っているのですが、最新ではエラーになるということでしょうか?
786デフォルトの名無しさん
2020/03/09(月) 23:35:25.22ID:XT24roZc よく読めよ
(本来だったら、ヘッダファイルにクラス定義をしてメンバ関数の実装は別ファイルで行なった方が適切です。(Allocationエラーを防げる))
(本来だったら、ヘッダファイルにクラス定義をしてメンバ関数の実装は別ファイルで行なった方が適切です。(Allocationエラーを防げる))
787デフォルトの名無しさん
2020/03/09(月) 23:41:32.15ID:otQrr6l+ inline関数を定義したファイル内からそのinline関数を呼ぶ分にはエラーにならない
別ファイルでmyClass.hppをインクルードしてinline関数を呼ぼうとするとエラーになる
という意味ではないだろうか
別ファイルでmyClass.hppをインクルードしてinline関数を呼ぼうとするとエラーになる
という意味ではないだろうか
788デフォルトの名無しさん
2020/03/09(月) 23:48:35.15ID:yYcTR1n2 >>787
なるほど。
自身のファイルならinlineの関数も見えているから展開できる。
他のファイルで使うときはinline展開する中身が見えないからエラーになる。
というのがしっくりきそうですね。
なるほど。
自身のファイルならinlineの関数も見えているから展開できる。
他のファイルで使うときはinline展開する中身が見えないからエラーになる。
というのがしっくりきそうですね。
789デフォルトの名無しさん
2020/03/10(火) 17:39:07.74ID:CIHR5C1w そのAllocationエラーを防げる、って何の話だろう
790デフォルトの名無しさん
2020/03/10(火) 18:47:12.48ID:VUvg76Dj 上のqiitaは初心者っぽいし正しいことを書いてるとは限らない
792デフォルトの名無しさん
2020/03/10(火) 19:21:46.83ID:VUvg76Dj 今のinlineの意味は「同じ定義である限り何度でも定義していいよ」だからな
展開云々はコンパイラが勝手にやる話であってプログラマが指定する話ではない
上のqiitaの人は昔のネット記事を読みながら勉強したんだろう
展開云々はコンパイラが勝手にやる話であってプログラマが指定する話ではない
上のqiitaの人は昔のネット記事を読みながら勉強したんだろう
793はちみつ餃子 ◆8X2XSCHEME
2020/03/10(火) 19:29:03.34ID:HIU8QCM9 でもまあ各翻訳単位に定義があれば結果的にインライン化しやすくはあるよな。
794デフォルトの名無しさん
2020/03/10(火) 21:03:29.37ID:tA89nuFe 今のinlineの効果は元のinlineの効果の必要条件
795デフォルトの名無しさん
2020/03/10(火) 22:56:08.25ID:y1k8c7Fe 788です。
私が作成しているプログラムではinlineに変えると逆に遅くなってしまったので元に戻しました。。
私が作成しているプログラムではinlineに変えると逆に遅くなってしまったので元に戻しました。。
796デフォルトの名無しさん
2020/03/11(水) 00:05:35.50ID:ECpQyQHt797はちみつ餃子 ◆8X2XSCHEME
2020/03/11(水) 00:22:12.50ID:FbH1Tm9+ >>796
正確なところは個別の場合を見てもらうしかないんだけど、
代表的な例としてたとえば erase なら削除したとこより後のイテレータは無効になるルール。
https://ja.cppreference.com/w/cpp/container/vector/erase
shrink_to_fit は再確保が発生したなら全て無効。
https://ja.cppreference.com/w/cpp/container/vector/shrink_to_fit
pop_back なら最後の要素と終端のイテレータが無効。
https://ja.cppreference.com/w/cpp/container/vector/pop_back
常識的な実装を考えればそりゃそうだろって感じで特に意外性はない。
正確なところは個別の場合を見てもらうしかないんだけど、
代表的な例としてたとえば erase なら削除したとこより後のイテレータは無効になるルール。
https://ja.cppreference.com/w/cpp/container/vector/erase
shrink_to_fit は再確保が発生したなら全て無効。
https://ja.cppreference.com/w/cpp/container/vector/shrink_to_fit
pop_back なら最後の要素と終端のイテレータが無効。
https://ja.cppreference.com/w/cpp/container/vector/pop_back
常識的な実装を考えればそりゃそうだろって感じで特に意外性はない。
798デフォルトの名無しさん
2020/03/11(水) 13:52:07.40ID:SPtGmxHY ……素朴に考えると範囲for文の中で削除してもよしなにやってくれそうな気はする
for(auto blt: enblts){
if( blt.isDead() ) enblts.erase(blt);
}
しかしこれはC++でもJava(remove)でも願い通りには動かない
でも弾幕ゲームをやってる初心者の直感では正しい
としたらこれから先の時代はフィルタで書いた方がいいのかもしれない
erase_if( enblts, [](Bullet blt){return blt.isDead();} );//c++, vector
enblts.remove_if( [](Bullet blt){return blt.isDead();} );//c++, list
enblts.removeIf( blt -> blt.isDead() );//java
enblts = filter( lambda blt: blt.isAlive(), enblts )#python
@enblts = grep{ $_->isAlive() } @enblts;#perl
for(auto blt: enblts){
if( blt.isDead() ) enblts.erase(blt);
}
しかしこれはC++でもJava(remove)でも願い通りには動かない
でも弾幕ゲームをやってる初心者の直感では正しい
としたらこれから先の時代はフィルタで書いた方がいいのかもしれない
erase_if( enblts, [](Bullet blt){return blt.isDead();} );//c++, vector
enblts.remove_if( [](Bullet blt){return blt.isDead();} );//c++, list
enblts.removeIf( blt -> blt.isDead() );//java
enblts = filter( lambda blt: blt.isAlive(), enblts )#python
@enblts = grep{ $_->isAlive() } @enblts;#perl
800デフォルトの名無しさん
2020/03/11(水) 17:00:24.04ID:U2q7VXWI801デフォルトの名無しさん
2020/03/11(水) 18:12:50.00ID:74rzlAzp802デフォルトの名無しさん
2020/03/11(水) 23:11:04.22ID:Z15vlJGb ↓こういう事って可能ですか?
class AClass
{
};
class BClass
{
public:
void Test();
};
int main ()
{
AClass a;
BClass b;
a += { &b, &BClass::Test }; //これを実現したい
}
class AClass
{
};
class BClass
{
public:
void Test();
};
int main ()
{
AClass a;
BClass b;
a += { &b, &BClass::Test }; //これを実現したい
}
803デフォルトの名無しさん
2020/03/11(水) 23:16:43.17ID:U9Axp26U >>801
ゲロ遅だけどな
ゲロ遅だけどな
804デフォルトの名無しさん
2020/03/11(水) 23:17:39.42ID:U9Axp26U >>802
何がしたいのかわからん
何がしたいのかわからん
805デフォルトの名無しさん
2020/03/11(水) 23:23:16.34ID:fq6QtVVC >>802
何をやりたいのかよくわからんがエスパーしてみると、メンバ関数ポインタやstd::function、演算子オーバーロードあたりを使えばいいのか
何をやりたいのかよくわからんがエスパーしてみると、メンバ関数ポインタやstd::function、演算子オーバーロードあたりを使えばいいのか
806デフォルトの名無しさん
2020/03/11(水) 23:36:37.62ID:74rzlAzp AClass::operator+=(std::initializer_list<void*>)でも実装すればいいのか?試してないけど
807デフォルトの名無しさん
2020/03/12(木) 00:07:14.34ID:dKrK1fwX {}で囲った物を、演算子やら関数なんかの引数として動くようにできるのか。言語仕様的に駄目なのかよくわからん。
ちなみに{}内の要素は異なる型が混在する。
C#のeventみたいな物を非マネージC++環境で作れないかと試している。
で、クラスメンバ関数の扱いで試行錯誤中。その他もろもろの実装はやれてるので、残りはこれだけ。
ちなみに{}内の要素は異なる型が混在する。
C#のeventみたいな物を非マネージC++環境で作れないかと試している。
で、クラスメンバ関数の扱いで試行錯誤中。その他もろもろの実装はやれてるので、残りはこれだけ。
808デフォルトの名無しさん
2020/03/12(木) 00:27:16.78ID:FwbIBGsL 関数テンプレートのテンプレート実引数推定時、引数に渡した{}は真っ先にinitializer_listとして推論されるので、異なる型を混在できない
引数をテンプレートじゃなくて、集成体とか普通のクラスにしとけば{}で渡せるけど、予め{}の中に入れられる型を固定しなければならない
引数をテンプレートじゃなくて、集成体とか普通のクラスにしとけば{}で渡せるけど、予め{}の中に入れられる型を固定しなければならない
809デフォルトの名無しさん
2020/03/12(木) 00:36:24.84ID:b+BTD4Kr こういうこと?
#include <iostream>
#include <vector>
#include <functional>
class AClass {
public:
void operator+=(std::function<void()> f) { handlers.push_back(f); }
void notify() { for (auto &f : handlers) f(); }
std::vector<std::function<void()>> handlers;
};
class BClass {
public:
void Test(){std::cout << __func__ << std::endl;}
};
int main () {
AClass a;
BClass b;
a += std::bind(&BClass::Test, &b);
a.notify();
}
#include <iostream>
#include <vector>
#include <functional>
class AClass {
public:
void operator+=(std::function<void()> f) { handlers.push_back(f); }
void notify() { for (auto &f : handlers) f(); }
std::vector<std::function<void()>> handlers;
};
class BClass {
public:
void Test(){std::cout << __func__ << std::endl;}
};
int main () {
AClass a;
BClass b;
a += std::bind(&BClass::Test, &b);
a.notify();
}
810デフォルトの名無しさん
2020/03/12(木) 01:57:39.17ID:dKrK1fwX >>809
一番初めに書いたけど、
a += { &b, &BClass::Test };
こういうすっきりした書き方ができないかと考えていたわけで。
std::function系はC#のeventで言う -= の挙動の実装が難なので、使っていません。
できないっぽいのでこの質問は終了とさせていただきます。
ご助言していただいた皆様ありがとうございました。
一番初めに書いたけど、
a += { &b, &BClass::Test };
こういうすっきりした書き方ができないかと考えていたわけで。
std::function系はC#のeventで言う -= の挙動の実装が難なので、使っていません。
できないっぽいのでこの質問は終了とさせていただきます。
ご助言していただいた皆様ありがとうございました。
811デフォルトの名無しさん
2020/03/12(木) 03:25:56.97ID:tyiaM2Xy c#ぽく書くのには限界あるよね
自分の場合は名前付きでstd::functionで持って
a.add("b",[&]{b.Test();})
みたいにしているな。
自分の場合は名前付きでstd::functionで持って
a.add("b",[&]{b.Test();})
みたいにしているな。
812デフォルトの名無しさん
2020/03/12(木) 12:41:33.69ID:yVQIWR3t EnumProcessModules でメインモジュール含め、全モジュールのベースアドレスとイメージサイズをゲットできると思うんですが
この範囲にないメモリ領域かつ、プロセスがコミットしてるメモリ領域って何が載っているんでしょうか?
検索していくと、MEM_COMMIT かつ PAGE_READWRITE かつ MEM_PRIVATE で、
プログラム中に書いた文字列がヒットするような領域もあるんですが
この範囲にないメモリ領域かつ、プロセスがコミットしてるメモリ領域って何が載っているんでしょうか?
検索していくと、MEM_COMMIT かつ PAGE_READWRITE かつ MEM_PRIVATE で、
プログラム中に書いた文字列がヒットするような領域もあるんですが
813デフォルトの名無しさん
2020/03/12(木) 13:29:56.54ID:jKEc330C >>803
リンクリストは速度的にはオールマイティーに近いデータ構造で、イテレートの速度も配列と同程度。
リンクリストは速度的にはオールマイティーに近いデータ構造で、イテレートの速度も配列と同程度。
814デフォルトの名無しさん
2020/03/12(木) 13:32:10.32ID:jKEc330C >>813
リンクリストが劇遅だと思っている人は、マシン語レベルでどういうコードになっているか分かって無いために、効率の良い使い方ができていないため。
正しく使えば、動的配列より平均速度もメモリ効率も速くなる確率が高いデータ構造。
リンクリストが劇遅だと思っている人は、マシン語レベルでどういうコードになっているか分かって無いために、効率の良い使い方ができていないため。
正しく使えば、動的配列より平均速度もメモリ効率も速くなる確率が高いデータ構造。
815810
2020/03/12(木) 15:24:18.59ID:dKrK1fwX 自己レスになりますが下記様なコードで最初の目的が達成できました。可変のコンストラクタ作っとくと{}の初期化の振り分けできるんですね。
template<class FUNC_TYPE>
class MetaFunction;
template<class ...ARG>
class MetaFunction<void(ARG...)>
{
public:
template<class ...INITARG>
MetaFunction(INITARG... arg) { Init(arg...); }
template<class T>
void Init(T* Instance, void(T::*proc)(ARG... arg))
{ //メンバ関数用の初期化
}
};
template<class FUNC_TYPE>
class EventHandler;
template<class ...ARG>
class EventHandler<void(ARG...)>
{
using META_FUNC = MetaFunction<void(ARG...)>;
public:
template<class T>
void Add(T* Instance, void (T::*proc)(ARG... arg))
{ //追加処理とか
}
inline EventHandler& operator+=(const META_FUNC& func)
{
this->Add(func);
return *this;
}
};
template<class FUNC_TYPE>
class MetaFunction;
template<class ...ARG>
class MetaFunction<void(ARG...)>
{
public:
template<class ...INITARG>
MetaFunction(INITARG... arg) { Init(arg...); }
template<class T>
void Init(T* Instance, void(T::*proc)(ARG... arg))
{ //メンバ関数用の初期化
}
};
template<class FUNC_TYPE>
class EventHandler;
template<class ...ARG>
class EventHandler<void(ARG...)>
{
using META_FUNC = MetaFunction<void(ARG...)>;
public:
template<class T>
void Add(T* Instance, void (T::*proc)(ARG... arg))
{ //追加処理とか
}
inline EventHandler& operator+=(const META_FUNC& func)
{
this->Add(func);
return *this;
}
};
816デフォルトの名無しさん
2020/03/12(木) 16:21:53.74ID:yVQIWR3t >>812
いろいろググってみましたが、分かったような分からんような…
とりあえず、MODULE_INFO.SizeOfImage は、読み込まれた Portable Executable のサイズを表してるっぽい?んでしょうか
コード命令が入ってる .text や、グローバル変数が入ってる .data 領域などいろいろ領域があってフォーマットが決まってるみたいだけど、
実行時のヒープやスタックとかは入ってないっていう認識で良いんでしょうか
PE のフォーマットググっても、exe をバイナリエディタで見たときのフォーマットは結構出てくるんですが、
メモリに載せた時のフォーマットって出てこないんですよね…、EXEをバイナリエディタで見た時と似たような感じだとは思うんですが多分まんまではないですよね
いろいろググってみましたが、分かったような分からんような…
とりあえず、MODULE_INFO.SizeOfImage は、読み込まれた Portable Executable のサイズを表してるっぽい?んでしょうか
コード命令が入ってる .text や、グローバル変数が入ってる .data 領域などいろいろ領域があってフォーマットが決まってるみたいだけど、
実行時のヒープやスタックとかは入ってないっていう認識で良いんでしょうか
PE のフォーマットググっても、exe をバイナリエディタで見たときのフォーマットは結構出てくるんですが、
メモリに載せた時のフォーマットって出てこないんですよね…、EXEをバイナリエディタで見た時と似たような感じだとは思うんですが多分まんまではないですよね
818デフォルトの名無しさん
2020/03/12(木) 17:45:34.82ID:5A3Kadll 遅いと思うとかじゃなくて実際にやった結果
listは激遅
dequeが1番良い
追加削除してもな
listは激遅
dequeが1番良い
追加削除してもな
819デフォルトの名無しさん
2020/03/12(木) 18:50:46.21ID:xw4q52xX >>812
C++関係ないからWin32APIスレとかで聞けばいいんでないの?
C++関係ないからWin32APIスレとかで聞けばいいんでないの?
820デフォルトの名無しさん
2020/03/12(木) 18:52:40.90ID:xw4q52xX >>813
リンクリストがオールマイティというのは、お前がリンクリスト使う処理しか書かないからというだけじゃね?
リンクリストがオールマイティというのは、お前がリンクリスト使う処理しか書かないからというだけじゃね?
821デフォルトの名無しさん
2020/03/12(木) 20:25:21.28ID:YvE3jgHm 天才の人でしょ
ほっとこ
ほっとこ
822デフォルトの名無しさん
2020/03/12(木) 20:30:58.97ID:9KLbHvc8 必死こいてリンクリスト宣伝して何になるんだろう
823デフォルトの名無しさん
2020/03/12(木) 20:40:10.69ID:yVQIWR3t824デフォルトの名無しさん
2020/03/12(木) 21:40:44.59ID:4MxR0DBA >>782
丁寧に説明していただいてありがとうございます!
丁寧に説明していただいてありがとうございます!
825デフォルトの名無しさん
2020/03/13(金) 03:26:23.39ID:BoiDYB4T ウヘン参照はどんなときに役立つんだ?
即値が代入出来るようになっただけか?
即値が代入出来るようになっただけか?
826デフォルトの名無しさん
2020/03/13(金) 07:01:46.94ID:8hjAly81 >>825
右辺値参照は右辺値(何もしないとその場で消えてなくなってしまうもの)をコピーを発生させずに捕まえておくことができる。
例:
>>782の
auto && __range = vec;
(正確にはauto&&はvecが左辺値の場合は通常の参照に、vecが右辺値の場合は右辺値参照になる)
他には関数のオーバーロードと組み合わせて引数が左辺値なのか右辺値なのかを区別して処理を振り分けることができる。
例:
void func(std::vector<int>& vec){ std::cout << "左辺値専用の処理" << std::endl; }
void func(std::vector<int>&& vec){ std::cout << "右辺値専用の処理" << std::endl; }
int main(){
std::vector<int> vec;
func(vec); // -> 左辺値専用の処理
func(std::vector<int>{1,2,3}); // -> 右辺値専用の処理
return 0;
}
右辺値参照は右辺値(何もしないとその場で消えてなくなってしまうもの)をコピーを発生させずに捕まえておくことができる。
例:
>>782の
auto && __range = vec;
(正確にはauto&&はvecが左辺値の場合は通常の参照に、vecが右辺値の場合は右辺値参照になる)
他には関数のオーバーロードと組み合わせて引数が左辺値なのか右辺値なのかを区別して処理を振り分けることができる。
例:
void func(std::vector<int>& vec){ std::cout << "左辺値専用の処理" << std::endl; }
void func(std::vector<int>&& vec){ std::cout << "右辺値専用の処理" << std::endl; }
int main(){
std::vector<int> vec;
func(vec); // -> 左辺値専用の処理
func(std::vector<int>{1,2,3}); // -> 右辺値専用の処理
return 0;
}
827はちみつ餃子 ◆8X2XSCHEME
2020/03/13(金) 09:59:34.43ID:o4vL6hq2 右辺値参照はほとんどムーブのための機能と言ってもいいかな。
左辺値か右辺値かを「区別」できることが重要であって、
参照の機能として特別なものがあるわけではない。
この区別が必要になったのはコピーの文脈かムーブの文脈かを知るため。
std::move が右辺値にキャストするだけということからも右辺値とムーブの関連性の強さが感じられる。
その上で右辺値参照と左辺値参照を自動で振り分ける参照 (ユニバーサル参照) を使えば
定義はひとつしか書いていないのに左辺値と右辺値の両方に対応できているなんてことも出来る。
ただし、右辺値参照は左辺値だということを忘れないように。
参照が左辺値参照か右辺値参照であるかを区別して再度振り分けなおすために std::forward がある。
左辺値か右辺値かを「区別」できることが重要であって、
参照の機能として特別なものがあるわけではない。
この区別が必要になったのはコピーの文脈かムーブの文脈かを知るため。
std::move が右辺値にキャストするだけということからも右辺値とムーブの関連性の強さが感じられる。
その上で右辺値参照と左辺値参照を自動で振り分ける参照 (ユニバーサル参照) を使えば
定義はひとつしか書いていないのに左辺値と右辺値の両方に対応できているなんてことも出来る。
ただし、右辺値参照は左辺値だということを忘れないように。
参照が左辺値参照か右辺値参照であるかを区別して再度振り分けなおすために std::forward がある。
828デフォルトの名無しさん
2020/03/13(金) 11:05:37.71ID:PLNbAfh2 auto&&は右辺値参照のくせに左辺値を束縛できるぞ
829デフォルトの名無しさん
2020/03/13(金) 12:25:06.20ID:0DRjOF6k ユニバーサルはテンプレートの文脈(なおかつTがテンプレート仮引数そのもの)
でなければ使えない
便利さばっか強調してると誤解招くぞ
でなければ使えない
便利さばっか強調してると誤解招くぞ
831デフォルトの名無しさん
2020/03/14(土) 06:54:36.59ID:rF6MWNax arithmeticとかpromotedってなんぞ
c++11以降のpow(int, int)の返り値はintなのですか?
c++11以降のpow(int, int)の返り値はintなのですか?
832デフォルトの名無しさん
2020/03/14(土) 09:56:19.78ID:LPZ7/QQq833はちみつ餃子 ◆8X2XSCHEME
2020/03/14(土) 15:29:27.33ID:7CRfyKLY >>831
候補として書いてある通りの型しかないよ。
https://ja.cppreference.com/w/cpp/numeric/math/pow
だけど、普通にオーバーロードしたら曖昧な状況が出来る場合があるだろ。
float foo(float x) { return x; }
double foo(double x) { return x; }
int main(void) {
foo(1); // どちらを呼び出せばいいのかわかんのでエラー。
return 0;
}
かといって int 版を追加、 long int 版、 long long int 版を追加……とかしていくのは面倒だなぁってことになるわけ。
それも二引数だったら全部の組み合わせが必要になってくる。
で、関数テンプレートで算術型ならなんでも受け取れるようにしておいて候補のどれかに振り分けるようにしようみたいな。
そういう感じ。
うまいこと振り分けなおす関数テンプレートがあるってだけ。
候補として書いてある通りの型しかないよ。
https://ja.cppreference.com/w/cpp/numeric/math/pow
だけど、普通にオーバーロードしたら曖昧な状況が出来る場合があるだろ。
float foo(float x) { return x; }
double foo(double x) { return x; }
int main(void) {
foo(1); // どちらを呼び出せばいいのかわかんのでエラー。
return 0;
}
かといって int 版を追加、 long int 版、 long long int 版を追加……とかしていくのは面倒だなぁってことになるわけ。
それも二引数だったら全部の組み合わせが必要になってくる。
で、関数テンプレートで算術型ならなんでも受け取れるようにしておいて候補のどれかに振り分けるようにしようみたいな。
そういう感じ。
うまいこと振り分けなおす関数テンプレートがあるってだけ。
834デフォルトの名無しさん
2020/03/14(土) 21:46:19.71ID:47FyzBVp c++のお勧め本教えて
初心者ではないけど、ここの話に付いていけるようにちゃんと学習したく。
初心者ではないけど、ここの話に付いていけるようにちゃんと学習したく。
835デフォルトの名無しさん
2020/03/14(土) 21:48:34.12ID:pvdkYWPZ とりあえずeffectve modern c++読んで
次は「ISO/IEC 14882:2017 Programming Languages -- C++」とかいう本を読むといいよ
次は「ISO/IEC 14882:2017 Programming Languages -- C++」とかいう本を読むといいよ
836デフォルトの名無しさん
2020/03/14(土) 23:28:51.97ID:mG8QFb0E 江添亮でいいのでは
837デフォルトの名無しさん
2020/03/15(日) 00:20:59.48ID:CAhbnrV8838デフォルトの名無しさん
2020/03/15(日) 01:01:17.34ID:r+ZbHRhu >>836
本の名前は?
本の名前は?
839デフォルトの名無しさん
2020/03/15(日) 07:49:43.36ID:4h5eTXB1840デフォルトの名無しさん
2020/03/15(日) 09:41:19.99ID:d31MAJ7H 捨て魔乙
841デフォルトの名無しさん
2020/03/15(日) 10:23:33.77ID:b9Qsc7j/ ステマというか、C++ の開発者で、
標準化委員会の江添亮、επιστημη(エピステーメー)、高橋 晶などを、
知らない香具師は、いないだろ
標準化委員会の江添亮、επιστημη(エピステーメー)、高橋 晶などを、
知らない香具師は、いないだろ
842デフォルトの名無しさん
2020/03/15(日) 10:26:55.73ID:xxuRolQk そりゃ有名だが悪い意味すぎるだろ。
843841
2020/03/15(日) 11:28:19.19ID:b9Qsc7j/ C++11/14 コア言語、江添 亮、2015
でも、この本は、プロにとっては、神の書!
規格書の意味を、簡潔なソースコードで例示したのだから
でも、C++の恐ろしいのは、これでもすべてじゃない!
あまりにもルールが多すぎるから、省略ばっかりw
でも、この本は、プロにとっては、神の書!
規格書の意味を、簡潔なソースコードで例示したのだから
でも、C++の恐ろしいのは、これでもすべてじゃない!
あまりにもルールが多すぎるから、省略ばっかりw
844841
2020/03/15(日) 11:34:21.68ID:b9Qsc7j/ 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
この研究会は、トヨタなど大企業から、数十人のベテが集まって、
簡潔なソースコードで例示したけど、
江添の「C++11/14 コア言語」は、一人で書いたのが恐ろしい。
エベレスト単独登頂ぐらいの記録w
あまりにも、crazy
この研究会は、トヨタなど大企業から、数十人のベテが集まって、
簡潔なソースコードで例示したけど、
江添の「C++11/14 コア言語」は、一人で書いたのが恐ろしい。
エベレスト単独登頂ぐらいの記録w
あまりにも、crazy
845デフォルトの名無しさん
2020/03/15(日) 11:36:58.87ID:uLtpsypH いまどき香具氏て…
846デフォルトの名無しさん
2020/03/15(日) 12:01:05.67ID:MhnteVR9 >>844
内容に間違いないことどうやって担保してんの?
内容に間違いないことどうやって担保してんの?
847デフォルトの名無しさん
2020/03/15(日) 12:06:13.12ID:4h5eTXB1 その本に限ったことではなく
聞いた話は他のソースで裏を取るのが
騙されたくない人のすることだ
お昼のワイドショーに洗脳されるBBAがこの逆をいく例
聞いた話は他のソースで裏を取るのが
騙されたくない人のすることだ
お昼のワイドショーに洗脳されるBBAがこの逆をいく例
849デフォルトの名無しさん
2020/03/15(日) 12:19:04.85ID:g709JiKq 原稿のコードを自動でチェックするシステムくらいは作れるだろ
他の間違いはしらない
他の間違いはしらない
850デフォルトの名無しさん
2020/03/15(日) 12:54:08.39ID:+dNV/3ST とりあえず明らかな間違いはあるな。
http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#expr.pseudo
> 疑似デストラクター呼び出しとは、デストラクターを明示的に呼び出すことができる一連の式である。
http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#expr.pseudo
> 疑似デストラクター呼び出しとは、デストラクターを明示的に呼び出すことができる一連の式である。
851デフォルトの名無しさん
2020/03/15(日) 13:31:42.55ID:kwDmCDNs ほんとだセミコロン忘れてる
852デフォルトの名無しさん
2020/03/15(日) 20:45:50.04ID:jQKVyB4O >>842
わろた
わろた
853デフォルトの名無しさん
2020/03/15(日) 21:05:04.93ID:mDv1gcW7 >>849
自動チェックに使うコンパイラは?
自動チェックに使うコンパイラは?
854デフォルトの名無しさん
2020/03/15(日) 21:16:57.24ID:+dNV/3ST855デフォルトの名無しさん
2020/03/15(日) 21:23:17.68ID:xxuRolQk そういうテストの発想が江添には根本的に欠けてる。
856デフォルトの名無しさん
2020/03/15(日) 21:31:41.42ID:kwDmCDNs あの人ソフトウェアエンジニアじゃないからな
857デフォルトの名無しさん
2020/03/15(日) 22:05:46.40ID:xxuRolQk 言語についてあれこれ言うなら今時は必要な視点だろ。
20年前で時間が止まってんのかね。
20年前で時間が止まってんのかね。
858デフォルトの名無しさん
2020/03/15(日) 22:40:56.98ID:+dNV/3ST コードのチェックについてはその後反省して改善したらしいよ。
https://cpplover.blogspot.com/2016/09/c17.html
> 参考書のソースコードからサンプルコードを抽出してコンパイルするテストは、適当なツールがなかったので適当に実装した。C++で書いて200行ぐらいだった。
https://cpplover.blogspot.com/2016/09/c17.html
> 参考書のソースコードからサンプルコードを抽出してコンパイルするテストは、適当なツールがなかったので適当に実装した。C++で書いて200行ぐらいだった。
859デフォルトの名無しさん
2020/03/15(日) 22:51:25.52ID:rc8Rza68 ストラウストラップの本こき下ろしてたクセにテメェもろくな本書けないっていう
ストラウストラップの本拾い読みする方が何万倍ありがたいわな
ストラウストラップの本拾い読みする方が何万倍ありがたいわな
江添さんのC++入門本を読んでいますが、「末尾再帰」を完全に間違えていますね…
私と同じ間違え方でしたが、私以外にも間違える人がまだ居るようですね
view-source:https://ezoeryou.github.io/cpp-intro/#再帰関数
>int factorial( int n )
>{
> if ( n < 1 )
> return 0 ;
> else if ( n == 1 )
> return 1 ;
> else
> return n * factorial(n-1) ;
>}
>この関数は、引数nが1未満であれば引数が間違っているので0を返す。そうでない場合でnが1であれば1を返す。それ以外の場合、n * factorial(n-1)を返す。
>このコードは末尾再帰になっている。
私と同じ間違え方でしたが、私以外にも間違える人がまだ居るようですね
view-source:https://ezoeryou.github.io/cpp-intro/#再帰関数
>int factorial( int n )
>{
> if ( n < 1 )
> return 0 ;
> else if ( n == 1 )
> return 1 ;
> else
> return n * factorial(n-1) ;
>}
>この関数は、引数nが1未満であれば引数が間違っているので0を返す。そうでない場合でnが1であれば1を返す。それ以外の場合、n * factorial(n-1)を返す。
>このコードは末尾再帰になっている。
861デフォルトの名無しさん
2020/03/16(月) 00:22:37.82ID:G3zRW41Y ええ・・・本にする前に誰も気付かんかったんか・・・
862デフォルトの名無しさん
2020/03/16(月) 00:45:44.02ID:0NEQgDaD863はちみつ餃子 ◆8X2XSCHEME
2020/03/16(月) 01:14:59.26ID:5L/YS0FP■ このスレッドは過去ログ倉庫に格納されています
