C++相談室 part149

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/02/18(火) 06:19:41.54ID:xvjipUWj
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/ (日本語)
2020/03/06(金) 12:31:07.14ID:1NgZSMCO
ダブルクォート含みのCSVとかをパースするための正規表現書く時とかいくらでもあるけど
raw文字列ってそういう時のための物じゃないの?
2020/03/06(金) 13:57:40.15ID:u9hNYNKX
>>713
> トリプルクォートとRaw文字列は役割違うし別にとっちらかってないけど?

それこそお前の感想だよね?w
役割が違う言えば聞こえがいいが、pythonの文字列リテラルは機能の直行性もない短絡的な設計
rawは短い正規表現などの用途しか考えてなくて複数行でかつエスケープなしができない
でそういうのが欲しいケースはいくらでもある
JSONを文字列で埋め込んでおきたい場合とかね

c++のrawは建て増しなのは同じだけど設計の筋は通ってる
ただもう一歩がんばってindent合わせが可能な仕様にしてほしかったな
2020/03/06(金) 13:59:12.86ID:ytQa5naT
>Pythonなら R"ABC" "¥"" "def" ってやるだけ
rawの意味ねぇなww
2020/03/06(金) 14:24:22.40ID:trP/ijr0
>>690
だから、64BITの時間をそのまま7で割らなくてはならないような状況に
なってしまうあなたの数学力が足りない。
2020/03/06(金) 14:28:35.64ID:trP/ijr0
>>717
それから、本当に桁数の多い数の割り算計算が本質的に必要な場合は多倍長計算ライブラリを使えばいい。
多くのアプリではそういう状況が少ないと言うことだ。
科学技術計算では、doubleか、4倍精度float数を扱えればいいので、64BIT整数が必要な場面は今のところ少ない。
メッシュの個数やループ回数が32BITを超えるようなものは、今のCPUでは重過ぎて普通、計算できない。
2020/03/06(金) 14:38:19.40ID:2gPy1GFt
>>717
64bitの時間? おまえさんもしかして、2922億年のことを言っているのか?
64bitの1秒であろうと32bitの1秒であろうと1秒は1秒でしかないんだが
2020/03/06(金) 14:41:03.85ID:hYOq9QPM
>>715
> rawは短い正規表現などの用途しか考えてなくて複数行でかつエスケープなしができない
まさかと思うがトリプルクォートとRaw文字列を組合せて使えることも知らんのか?
そんな知識で直行性とか語るなよw
2020/03/06(金) 14:45:21.47ID:hYOq9QPM
>>716
まああんまり無いケースだから多少見辛いのはしゃーない
C#みたいな方がまだマシだとは思うが
2020/03/06(金) 14:45:22.11ID:gkPkCuAw
業界全体の傾向では「printfへの回帰」が見られる
fmtはprintfの21世紀型強化版として捉える

つまり、+や<<で連結するのはどの言語でも煩わしかった
だからprintf(のようなもの)に戻ってきている

CUIやテキストへの出力はprintf程度で充分だった、と誰もが気付いた
2020/03/06(金) 14:45:35.04ID:2gPy1GFt
複数行できるぞ

std::cout << R"(abc)"
R"(def)"
"\nghi" << std::endl;

しかもエスケープあり/なしを途中で切り替えることまでできる
724デフォルトの名無しさん
垢版 |
2020/03/06(金) 14:53:31.38ID:89RQTO1C
普通は16ビットあれば十分ですよ。
64ビット厨はプログラムしたことあるの?
2020/03/06(金) 15:11:10.95ID:/2BnMzJ+
ポインタ使えないだろ
2020/03/06(金) 15:34:10.40ID:1NgZSMCO
>>718
へー
お前の世界の普通の会計ソフトは43億円を扱えないし
お前の世界の普通の防犯カメラは43億ミリ秒(たった5日)連続稼働したら落ちるし
お前の世界の普通のOSは4GBのファイルを作れないのか

アホくさ
2020/03/06(金) 15:56:44.11ID:trP/ijr0
>>726
16BIT時代から一兆円は扱えた。
Z80 はマシン語としては整数の掛け算/割り算も浮動小数点も全くサポートしてなかったが、BASIC言語ではどれも普通に出来た。
同様に、32BIT CPUでも、64BIT整数が扱えないわけではない。
728デフォルトの名無しさん
垢版 |
2020/03/06(金) 16:00:14.00ID:89RQTO1C
intは16ビットが正解。
2020/03/06(金) 16:03:04.34ID:u9hNYNKX
>>720
まじか・・・正直その組み合わせ気づいてなかったわ
ただやはりpythonはエスケープフリーで任意の文字を含められない点で機能が不完全
2020/03/06(金) 16:40:55.40ID:7d5kGJiP
pythonは文字列まわりがとっちらかって結局2と3で分裂したが。
2020/03/06(金) 17:14:18.31ID:1NgZSMCO
python2で混乱してたのはraw周りじゃないぞ
文字列の文法は3でもほとんど変わってないはず
strとunicodeとbyte(に相当するもの)の扱いがナイーブ過ぎてグッチャグチャだったのがpython2の大問題
2020/03/06(金) 18:10:29.44ID:k+5uYmSv
>>729
pythonでも"と'を同時に使わない限り何でもかけるじゃん。
一方、c++は)"という並びを文字列中にかけない制限があるわけなんで、
もちろん後者のほうか確率は低いけど、pythonを一方的に機能不全と言えるほどじゃないなー
2020/03/06(金) 18:15:02.80ID:2gPy1GFt
>>732
書けるぞ
R"a(  )"  )a"
2020/03/06(金) 18:26:07.10ID:k+5uYmSv
>>733
回線切って吊ってくる
2020/03/06(金) 18:43:12.26ID:XdrWOsjB
>>718
>多倍長計算ライブラリ
GMP が有名どころではありますが、GPL なのが嫌ですね
そういう人のために、かなり遅いのですけれども https://mevius.5ch.net/test/read.cgi/tech/1434079972/51 を公開していますので、よろしければ使ってください
2020/03/06(金) 20:27:49.81ID:hYOq9QPM
>>732
いや書くためにユーザーに指定させるようにしてるんだけど正直そこまでやる価値はあるんか?
って話
理念はわからなくもないけどやりすぎ感半端ない
2020/03/06(金) 21:30:02.51ID:ytQa5naT
やりたくない奴はやらなきゃいいだけ
この機能はあった方がいい
ないとrawから離れてしまうのは君自身が>713で例示している
2020/03/06(金) 22:02:29.04ID:Oq5LDxMU
>>737
嫌なら使わなきゃ良いってか?
PythonなりC#.並の記述ができるならいいけどそうじゃないからねぇ
2020/03/07(土) 00:05:13.96ID:aYdkWxa2
>>51
We regret to inform you that we are shutting down code.hackerearth.com.

Apologies for any inconvenience caused.

Thank you for understanding.
2020/03/07(土) 01:02:00.91ID:aYdkWxa2
>>735
>>739
というエラーが出てページが表示できない。
2020/03/07(土) 01:12:05.61ID:S+zsWTTW
>>740
それは https://code.hackerearth.com の今のメッセージですね、サーバーシャットダウン中でごめんなさい、ですか
ではこちらをみてください https://code.hackerearth.com/11eea6E>>740
2020/03/07(土) 01:33:50.20ID:aYdkWxa2
>>741
症状変わらず。
あなた、試してないよね?
2020/03/07(土) 01:40:43.07ID:S+zsWTTW
>>742
申し訳ございません、コードを ideone に張ったものと記憶違いをしていました
>>735 より前のバージョンを https://mevius.5ch.net/test/read.cgi/tech/1434079972/37 に置いています
2020/03/07(土) 07:24:46.08ID:HWBpZxET
>>729
> ただやはりpythonはエスケープフリーで任意の文字を含められない点で機能が不完全
だから前にも書いたけどそんな機会がどんだけあるんだよって話な
ぱっと思いつくのは " や ' を含む正規表現を書きたい時ぐらいだけど毎回そんなものを書かないだろ
めったに無い時のために毎回無駄な ( ) を書かされるのはちょっと嫌
※ 最後の行は個人の見解です
2020/03/07(土) 08:46:17.40ID:CT6knIM5
すみません、教えてください
JAVAだとinterfaceを定義してsetListner的なことが出来て、リスナー不要なときはnullを指定できます。

C++だとどうかけばいいでしょうか?
interface用のクラスを一つ用意してvirtualメソッドを並べれば出来そうな気がしますが、リスナー不要な時に上位からnullを指定できない気がしていて
746デフォルトの名無しさん
垢版 |
2020/03/07(土) 09:53:24.66ID:iUAwzQ87
std::functionが一番簡単だと思いますが。
2020/03/07(土) 10:21:48.59ID:CT6knIM5
ありがとうございます。

具体的なコードを教えて頂けないでしょうか?
例えば、適当に拾った以下のJavaコードを例にして同じ事を出来るとC++のサンプルを教えて頂けると参考になります。

続く
2020/03/07(土) 10:21:58.29ID:CT6knIM5
class HeavyTask {
    private TestListener listener;
    // interface 設定
    interface TestListener {
        void onSuccess(int result);
    }
    // listener
    void setListener(TestListener listener) {
        this.listener = listener;
    }

    void taskStart() {
        int sum = 1;
        int i= 0;

        for ( ; i<  20; ){
            sum += sum;
            i++;
        }

        if(listener != null) {
            // 計算が終わったら結果をlistenerに渡す
            listener.onSuccess(sum);
        }
    }
}
749デフォルトの名無しさん
垢版 |
2020/03/07(土) 11:01:38.19ID:iUAwzQ87
え?めんどくさいですが?
2020/03/07(土) 11:04:48.12ID:CT6knIM5
すみません、簡単な例でいいので、リスナー登録してそこから複数のメソッドがイベント毎に呼ばれるようにする方法がしりたいです。。
751デフォルトの名無しさん
垢版 |
2020/03/07(土) 11:09:04.29ID:iUAwzQ87
std::functionは関数っぽいものなら何でも突っ込めるので、好きなようにお使いくださいとしか。

本当は出来ないんだろ?とか煽ればだれか書いてくれるかも。
2020/03/07(土) 11:13:54.29ID:CT6knIM5
まだイメージが沸かないですよね。。使い方も
2020/03/07(土) 11:20:59.13ID:NiWYPfBM
最初に自分がいってるとおりじゃないんか
インターフェイスの派生クラスのポインタ渡せばいいだけで
不要なら0入れて呼ぶときにチェックするだけじゃないの
2020/03/07(土) 11:27:48.77ID:AiHnVJpq
てか、C++でもほとんど>>748と同じようなコードになるだろ
2020/03/07(土) 12:03:07.45ID:CT6knIM5
具体的にfuntionを使って、リスナーをnewして呼び出すあたりとかコードがみたいです。。virtualだと誰かが継承してクラス化しないとだめですよね?

Javaのように、setListenerの引数にリスナーだけnewしてしていとか、null指定とかする方法がやっぱりよくわからないです。
2020/03/07(土) 12:05:29.33ID:qpmtEUNF
そのjava版晒せば変換してやるが
2020/03/07(土) 12:06:49.73ID:CT6knIM5
ちょっとまってください
2020/03/07(土) 12:07:03.25ID:NiWYPfBM
クラス化してポインタで管理するだけ
javaみたくnewでそのままオーバーライドはできないと思う
やりようあるんかな
2020/03/07(土) 12:10:36.55ID:NiWYPfBM
newしてラムダ式でも渡せばできるか
2020/03/07(土) 12:12:57.85ID:qpmtEUNF
new要らんのでは?
2020/03/07(土) 12:21:54.31ID:CT6knIM5
すみませんが、これでお願いします。
C++のfunctionを利用して、一番スマートな感じなコードを教えてください。
m(__)m

続く↓
2020/03/07(土) 12:22:53.25ID:CT6knIM5
// 上位からやりたいこと
class Main {
Test test = new Test();

test.setListener(null); // callback不要な時はnullを指定したい

// callbackが欲しい時はこんな感じで登録したい
test.setListener(new Test.TestListener() {
@Override
onSuccess(int result) {
System.out.println(result);
}
@Override
onError(int errorCode) {
System.out.println(errorCode);
}
});
test.run();
}
続く↓
2020/03/07(土) 12:23:36.37ID:CT6knIM5
// Testの中身の作りはどうでもいいです。
// Main側からTest側が綺麗に呼び出せれば、それに合わせてTest側を作りかえるでOKです。
class Test {
interface TestListener {
void onSuccess(int result);
void onError(int errorCode);
}
private TestListener listener;

void setListener(TestListener listener) {
this.listener = listener;
}

void run() {
if (listener != null) {
listener.onSuccess(0);
listener.onError(1);
}
}
}
2020/03/07(土) 12:24:15.53ID:CT6knIM5
スペースがちゃんと入ってなく、見づらくて申し訳ないです。
よろしくお願いしますm(__)m
2020/03/07(土) 12:37:30.49ID:+VsyTV1D
こんな自分でやる気のない人にはぜひエサを与えないでほしい。
766デフォルトの名無しさん
垢版 |
2020/03/07(土) 12:39:57.68ID:iUAwzQ87
いや、困ってるみたいだし、書いてやれよ。
俺がケチョンケチョンに添削してやるから。
2020/03/07(土) 12:40:37.61ID:CT6knIM5
やる気がないわけではなくて、勉強しているけどどう書くのか分からないだけです。。
2020/03/07(土) 12:45:37.23ID:CT6knIM5
C++だと、イメージだけど
test.setListener([](int result)) { print(result); });
みたいにかけそうってのはわかりましたが。。

NULL指定したい時とか複数のoverride対象の
メソッドを並べる書き方とか良く分からず。
2020/03/07(土) 13:05:14.05ID:ECZE2b67
class TestListener {
public:
virtual void onSuccess(int result) { }
virtual void onError(int errorCode) { }
};
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);
}
};
2020/03/07(土) 13:10:29.44ID:qpmtEUNF
https://wandbox.org/permlink/zaFleQEzG1dSUuAL
2020/03/07(土) 13:12:54.90ID:0g+cGFce
式としての匿名クラスはc++には無いよ。
クラス宣言としての無名(?)クラスは書けるけど。
https://ideone.com/SnMj5k
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();
2020/03/07(土) 13:18:44.05ID:CT6knIM5
ありがとうございます。

>>771
Test2がイメージしていたのと近いです。
こんな感じで書くんですね。
775772
垢版 |
2020/03/07(土) 13:20:39.61ID:0g+cGFce
>>768
> 複数のoverride対象のメソッドを並べる書き方とか

>>772はこれ↑についてのレスね。
foo.addMouseListener(new MouseAdapter() {
 public void mouseClicked(MouseEvent e) {}
 public void mouseMoved(MouseEvent e) {}
});
きっと↑こーいうのがやりたいんだと思って。
2020/03/07(土) 13:20:43.30ID:CT6knIM5
ちょっと試してみます
2020/03/07(土) 14:15:14.60ID:CT6knIM5
ありがとうございました。
内容は大体理解できたので、今後のテンプレとして使わせていただきます。
助かりました!
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
2020/03/08(日) 23:05:19.29ID:SIolBUWz
emplace_back()の時にvectorのサイズが拡張されて中身が再配置されることがある
そうなると拡張前に取ったポインタは無効になる

嫌だったらvectorの挿入削除が一通り終わってからポインタ取るとか、
必要量でreserve()して再配置されないようにするとか、deque使うとかその辺
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 の定義を外に出したときと比べてパフォーマンス上の違いある?
2020/03/09(月) 07:59:37.36ID:kzUaYlzv
&
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の定義を外に出す必要はない
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 みたいなこと。
要素の数が増えるような操作はだいたいイテレータを無効にすると覚えておけばいい。
2020/03/09(月) 22:02:02.24ID:0hJmIbuo
>>779,783

vectorは連続したアドレスだから拡張していけば必ず再配置しないといけなくなりますね。
納得しました。
reserveを検討してみます。
2020/03/09(月) 22:50:43.87ID:yYcTR1n2
inlineについて質問です。

ttps://qiita.com/omuRice/items/9e31d9ba17b32703b3b1

上記を見ると下記のように書いてあります。

//ヘッダファイルでしかinlineで定義できない
//別ファイルで書くとinline展開の時にエラーになる.

しかしヘッダファイルではなく、クラスの本体ファイルの方に書いてもエラーになりませんでした。
c++11を使っているのですが、最新ではエラーになるということでしょうか?
2020/03/09(月) 23:35:25.22ID:XT24roZc
よく読めよ

(本来だったら、ヘッダファイルにクラス定義をしてメンバ関数の実装は別ファイルで行なった方が適切です。(Allocationエラーを防げる))
2020/03/09(月) 23:41:32.15ID:otQrr6l+
inline関数を定義したファイル内からそのinline関数を呼ぶ分にはエラーにならない
別ファイルでmyClass.hppをインクルードしてinline関数を呼ぼうとするとエラーになる
という意味ではないだろうか
2020/03/09(月) 23:48:35.15ID:yYcTR1n2
>>787

なるほど。
自身のファイルならinlineの関数も見えているから展開できる。
他のファイルで使うときはinline展開する中身が見えないからエラーになる。
というのがしっくりきそうですね。
2020/03/10(火) 17:39:07.74ID:CIHR5C1w
そのAllocationエラーを防げる、って何の話だろう
2020/03/10(火) 18:47:12.48ID:VUvg76Dj
上のqiitaは初心者っぽいし正しいことを書いてるとは限らない
2020/03/10(火) 19:12:03.87ID:HIU8QCM9
>>789-790
俺はそれよりも「インラン展開」の方が気になる
2020/03/10(火) 19:21:46.83ID:VUvg76Dj
今のinlineの意味は「同じ定義である限り何度でも定義していいよ」だからな
展開云々はコンパイラが勝手にやる話であってプログラマが指定する話ではない
上のqiitaの人は昔のネット記事を読みながら勉強したんだろう
2020/03/10(火) 19:29:03.34ID:HIU8QCM9
でもまあ各翻訳単位に定義があれば結果的にインライン化しやすくはあるよな。
2020/03/10(火) 21:03:29.37ID:tA89nuFe
今のinlineの効果は元のinlineの効果の必要条件
2020/03/10(火) 22:56:08.25ID:y1k8c7Fe
788です。
私が作成しているプログラムではinlineに変えると逆に遅くなってしまったので元に戻しました。。
2020/03/11(水) 00:05:35.50ID:ECpQyQHt
>>783
>要素の数が増えるような操作はだいたいイテレータを無効にすると覚えておけばいい。
削除は!?
要素の削除はどうなるのです??!!
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

常識的な実装を考えればそりゃそうだろって感じで特に意外性はない。
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
2020/03/11(水) 16:06:43.34ID:FbH1Tm9+
>>798
C++20 で ranges が入るよ。
2020/03/11(水) 17:00:24.04ID:U2q7VXWI
https://en.cppreference.com/w/cpp/container

Iterator rinvalidationに一覧表が載ってるからみなはれ
2020/03/11(水) 18:12:50.00ID:74rzlAzp
>>798
listなら直感どおりに動くぞ
やっぱlistなんだよなあ
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 }; //これを実現したい
}
2020/03/11(水) 23:16:43.17ID:U9Axp26U
>>801
ゲロ遅だけどな
2020/03/11(水) 23:17:39.42ID:U9Axp26U
>>802
何がしたいのかわからん
2020/03/11(水) 23:23:16.34ID:fq6QtVVC
>>802
何をやりたいのかよくわからんがエスパーしてみると、メンバ関数ポインタやstd::function、演算子オーバーロードあたりを使えばいいのか
2020/03/11(水) 23:36:37.62ID:74rzlAzp
AClass::operator+=(std::initializer_list<void*>)でも実装すればいいのか?試してないけど
2020/03/12(木) 00:07:14.34ID:dKrK1fwX
{}で囲った物を、演算子やら関数なんかの引数として動くようにできるのか。言語仕様的に駄目なのかよくわからん。
ちなみに{}内の要素は異なる型が混在する。
C#のeventみたいな物を非マネージC++環境で作れないかと試している。
で、クラスメンバ関数の扱いで試行錯誤中。その他もろもろの実装はやれてるので、残りはこれだけ。
2020/03/12(木) 00:27:16.78ID:FwbIBGsL
関数テンプレートのテンプレート実引数推定時、引数に渡した{}は真っ先にinitializer_listとして推論されるので、異なる型を混在できない
引数をテンプレートじゃなくて、集成体とか普通のクラスにしとけば{}で渡せるけど、予め{}の中に入れられる型を固定しなければならない
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();
}
2020/03/12(木) 01:57:39.17ID:dKrK1fwX
>>809
一番初めに書いたけど、
a += { &b, &BClass::Test };
こういうすっきりした書き方ができないかと考えていたわけで。
std::function系はC#のeventで言う -= の挙動の実装が難なので、使っていません。

できないっぽいのでこの質問は終了とさせていただきます。
ご助言していただいた皆様ありがとうございました。
2020/03/12(木) 03:25:56.97ID:tyiaM2Xy
c#ぽく書くのには限界あるよね

自分の場合は名前付きでstd::functionで持って
a.add("b",[&]{b.Test();})
みたいにしているな。
2020/03/12(木) 12:41:33.69ID:yVQIWR3t
EnumProcessModules でメインモジュール含め、全モジュールのベースアドレスとイメージサイズをゲットできると思うんですが
この範囲にないメモリ領域かつ、プロセスがコミットしてるメモリ領域って何が載っているんでしょうか?

検索していくと、MEM_COMMIT かつ PAGE_READWRITE かつ MEM_PRIVATE で、
プログラム中に書いた文字列がヒットするような領域もあるんですが
2020/03/12(木) 13:29:56.54ID:jKEc330C
>>803
リンクリストは速度的にはオールマイティーに近いデータ構造で、イテレートの速度も配列と同程度。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況