[過去ログ] C++相談室 part146 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
943
(3): ◆QZaw55cn4c 2019/12/15(日)19:42 ID:gCPcwtH+(1) AAS
永遠の初心者です、お願いします
1. 式で if 文を表現したいときは条件演算子(三項演算子 ?: )が使えますが、同じく式でループ構造を表す方法は C++11 以後にありますでしょうか?
2. 1 の質問の理由としては、C++ は Java とちがって uper() がなく、派生クラスのコンストラクタの基底クラス初期化部分に式しか書けません、ここにループを書くとすれば「コンストラクタ用メンバ関数(メソッド)」を置いていますがいかにも無様だと思っています…
3. ある既存のクラスに皮をかぶせて機能アップを図るとき、もとのクラスの派生クラスとして機能アップ部分を既述することは、よくある定石でしょうか、それともあまりしないことでしょうか?

---
以上3点の質問は以下のプログラムを書いていて感じました
お題は「エラトステネスのふるい」、ただし、当初、まっとうにふるいを書いた後、機能アップ項目として
篩部分に格納する数は 2n + 1 奇数に限定する、あるいは 6n + 1, 6n + 5 の形のみに限定する
等を元の篩に対して派生クラスとして記述しました
外部リンク:ideone.com
944
(1): 2019/12/15(日)20:01 ID:01f7hQnX(1) AAS
>>943
ラムダ式の出番かな?
void test(bool flag) { flag ? []{ for(int i = 0; i < 10; ++i) cout << i; } : throw 1; }
945
(1): 2019/12/15(日)20:05 ID:5sPbacoo(1/4) AAS
エラストテネス
6n+1, 6n+5だけ保持とかってみんな考えるよね

ちなみに
巨大なテーブル作成時のパフォーマンスを上げるなら
キャッシュが効くよう分割処理するのが非常に効果的
スレッド分割の為にいずれにしろ分割処理は作る事になる
946: 2019/12/15(日)20:07 ID:5sPbacoo(2/4) AAS
エラトステネス
947: 2019/12/15(日)20:14 ID:mkXjftMX(1) AAS
高分子エラストマー
948
(1): はちみつ餃子 ◆8X2XSCHEME 2019/12/15(日)20:20 ID:jthcUe0A(1/2) AAS
>>943
初期化部分に複雑な処理をベタ書きする方が無様だと思うよ。
初期化リストの中にそんなごちゃごちゃしたこと書きたい?
ワイが思うだけなので世間でどう思われてるかは知らんけどとりあえずひとつの意見として。
949
(1): 2019/12/15(日)20:54 ID:TKBas8kS(1/2) AAS
>>939

親クラス(Base)のデストラクタに virtual 付けなくても...
{
shared_ptr<Base> obj( new Derived() );
} // ~Derived() called, then ~Base() called.

~Derived() はコールされるんですね... 確認してみて驚きました。
これができる仕組みを誰か教えてください。
スマートポインタのオブジェクトは子クラスの事何も知らないのに
どうして ~Derived() のコールが可能なのでしょうか?
950
(1): 2019/12/15(日)21:07 ID:2FA7t6Jx(2/2) AAS
>>949
いわゆるtype erasure
外部リンク:blog.cryolite.net
951
(1): 2019/12/15(日)21:19 ID:TKBas8kS(2/2) AAS
>>950
まだ仕組みのとこまでですが理解できました。ありがとうございます。
952: 2019/12/15(日)21:24 ID:tmrMX5L5(3/4) AAS
質問ですが構造体Fooの内側に構造体Barが定義されているという入れ子になった構造体において、
Fooの外のコードでFoo::Barのサイズをsizeof()で知りたいとき、以下は正しい?
1. C++だとsizeof(Foo::Bar)と書いたらおk
2. CまたはC++でもC互換構文の範疇で済ます場合、次のどちらかの方法でしか書けない
(1) Foo::Barのインスタンスyが存在するスコープ内で、sizeof(y)と書く
(2) Fooのインスタンスxが存在するスコープ内において、Foo::Bar型のメンバyをFooが持つ
    (Foo::yが定義されている)という条件の下で、sizeof(x.y)と書く
953
(1): 2019/12/15(日)21:39 ID:tmrMX5L5(4/4) AAS
ふとオモタがインスタンスの必要性は無くせるかもしれん
Foo::Bar型のメンバFoo::yが定義さえされておれば、Fooのインスタンスが無くても
 sizeof(((Foo*)0)->y)
と書けばC言語で逝けるかもしれん…
スゲー気持ち悪いコードだが、、、、
954: 2019/12/15(日)21:46 ID:PfQY9kAx(2/3) AAS
>>951
あくまでコンパイル時の型で決まるだけだから要注意
例えば

class A;
class B : public A;

A* p = new B();
std::shared_ptr<A> a(p);

これだとBのデストラクタは呼ばれない
955: 2019/12/15(日)21:48 ID:5sPbacoo(3/4) AAS
なんでそんな中途半端な機能を
わざわざコストをかけて入れたんだろう
956: 2019/12/15(日)21:49 ID:5sPbacoo(4/4) AAS
やむを得ず
なんだろうけど
957: 2019/12/15(日)21:51 ID:PfQY9kAx(3/3) AAS
>>953
Linuxカーネルとかそういう感じのマクロ満載だよ
C言語はそういうもん
958: 2019/12/15(日)22:05 ID:TeOOTcIs(2/2) AAS
type erasureと相性悪いんだっけ
959
(1): はちみつ餃子 ◆8X2XSCHEME 2019/12/15(日)22:15 ID:jthcUe0A(2/2) AAS
>>943
思い出した。
gcc や clang の拡張で良ければ複文が式になる。
だいぶん昔からある機能。

#include <vector>
#include <iostream>

int main() {
std::vector<int> foo(({int i; for(i=0; i<3; i++); i;}));
std::cout << foo.size() << std::endl;
return 0;
省1
960
(1): ◆QZaw55cn4c 2019/12/16(月)19:39 ID:NZyGx79l(1) AAS
>>944,945,948,959
コメントありがとうございます!

>>944,959
まずgcc拡張
>SieveDerived(int n) : Sieve<T>(({int r; while((r = index(n)) == 0) n--; r;})) { } /* HERE!! */
で問題なく動作しました
すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました
次にラムダ式で定義して即評価する方法がみつかりました
>SieveDerived(int n) : Sieve<T>([](int n)->int{int r; while ((r = index(n)) == 0) n--; return r;}(n)) { } /* HERE!! */
これがやりたかった!とても満足しています、ありがとうございました!
省7
961: 2019/12/16(月)20:14 ID:89loOkbp(1) AAS
まあこういう自己満は通過儀礼だよな
962: 2019/12/16(月)21:46 ID:kSgVv2yp(1) AAS
lambdaの即時評価はjsだと多用されているイメージ
ブロックスコープないからね
1-
あと 40 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.398s*