1 名前:デフォルトの名無しさん mailto:sage [2012/05/08(火) 04:55:24.99 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part94 toro.2ch.net/test/read.cgi/tech/1329512856/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.78【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1331894668/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
637 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 19:13:51.16 ] >>635 評価順序の話か? その危険なコードとやらがどう危険なんだ?
638 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 19:33:33.75 ] >>637 new A()実行後にunique_ptrに渡される前にnew B()が呼ばれ Bのコンストラクタが例外を出すとAは解放されない 並列関係を超えない場合はnew A()の結果が必ずunique_ptrに渡されるので、 その後Bが例外を出してもunique_ptrのデストラクタで例外安全は保たれる ↓はshared_ptrでの例、C++11/unique_ptrでも同様 www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm >Avoid using unnamed shared_ptr temporaries to save typing; to see why this is dangerous >void bad() >{ > f(shared_ptr<int>(new int(2)), g()); >} 関数の引数で無名スマポを作ってはいけないという話
639 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 20:01:42.25 ] 一応引数内でもラムダ使えば評価順序をブロック化出来るか 流石にやんないけど f([&](){return std::unique_ptr<A>(new A());}(), [&](){return std::unique_ptr<A>(new A());}()); ideone.com/hJh8q
640 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 20:06:10.81 ] >>636 引数の評価順が固定されない方が最適化が楽な処理系があるからに決まってるじゃん
641 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 20:16:38.14 ] >>640 それと引き換えにスマポを一時オブジェクトにすることで可能な最適化が出来なくなってる あと評価順の固定とまでは言ってない、並列関係を越えないことの保証と言ってる f(a(), b(d()), c())がb,c,aという順でもいいけど、 dとbの間にa,cが入らないのを保証して欲しいということ その制限でも出来なくなる最適化はあるだろうけどさ、トレードオフに見合うかは疑問
642 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 20:37:01.40 ] >>640 stdcallとcdeclじゃ引数の積み方が逆だし 今更固定にできないよな
643 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 20:51:49.09 ] >>641 スマポはtemplateが入ってきてからboostから入れられた概念だろ それに対し引数の評価順はC時代から規定されていない スマポがC++98/2003にもう入っていたら規定されてたかもね 他にも&&や||のオーバーロードも短絡評価ではなく全部評価してしまう という元の演算子とは異なる挙動を見せるなど問題点は一杯あるだろ More Effective C++に書いてあるけど
644 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 20:55:17.19 ] てか便利な仕様だな コンパイラーベンダーは、引数で時間のかかる処理呼ばれたら スレッド化する最適化とかすりゃいいのに
645 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 21:03:14.06 ] でも並列化で早くなるかどうかは環境次第だしなあ 1コアで並列化しても意味が無いし
646 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 21:06:49.51 ] アーキティクチャー指定でいいんじゃね 今でもSSEなんてそうだし
647 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 21:28:25.32 ] 数値と文字列で比較はできても結合できる必要は無いな 既に似たような仕組みがあるし
648 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 21:28:43.05 ] 誤爆した・・・
649 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 21:31:12.76 ] 似てるからね
650 名前:デフォルトの名無しさん mailto:sage [2012/06/05(火) 21:32:15.39 ] どこのを誤爆したかすぐにわかってしまったw
651 名前:デフォルトの名無しさん [2012/06/05(火) 22:23:05.31 ] このスレいつからC++11板に・・・(笑 現実的に考えて日本語版Effective C++11が出るくらいまで (2年後くらい?)はC++11普及しない気がする。 もっと悲観的な見方をすれば、爆発的な機能増強のせいで、 C++03に対するC言語ユーザの認識程度にしか広まらなかったりして。 「あ〜C++11ね、コンパイラは使ってるけどね」 そのへんどう考えてるの>偉い人
652 名前:デフォルトの名無しさん mailto:sage [2012/06/06(水) 12:59:59.19 ] C++11板とか単一言語しか許されない板怖すぎる
653 名前:デフォルトの名無しさん mailto:sage [2012/06/06(水) 14:45:53.32 ] C++11はC++の一方言だ
654 名前:デフォルトの名無しさん mailto:sage [2012/06/07(木) 10:09:46.63 ] >>652 auto_ptrは板違いとか言われそうw
655 名前:デフォルトの名無しさん mailto:sage [2012/06/07(木) 20:46:47.32 ] まだ規格から消えてないから大丈夫
656 名前:デフォルトの名無しさん mailto:sage [2012/06/07(木) 21:07:08.62 ] でもdepricatedなんだろ
657 名前:デフォルトの名無しさん mailto:sage [2012/06/07(木) 21:28:46.06 ] exportに比べればマシな扱いさ
658 名前:デフォルトの名無しさん mailto:sage [2012/06/07(木) 21:33:27.84 ] const auto_ptrなら残してもいいと思う
659 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 16:01:44.79 ] const auto_ptrは感動した
660 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 20:08:17.52 ] 別にunique_ptrでええやん
661 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 20:37:16.62 ] だってまだ無かったりtr1だったりする環境が・・・
662 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 20:40:21.33 ] boostに03で動くのなかったか 使ったことないからどんなできかは知らんが
663 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 21:38:15.30 ] LPCTSTRも仲間に入れてあげて
664 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 21:41:46.55 ] >>662 C++11のものと同じような使い勝手だと思うとモニターに右ストレート叩き込みたくなるレベル
665 名前:デフォルトの名無しさん mailto:sage [2012/06/08(金) 22:58:15.54 ] C++11が使えないならboost::scoped_ptrを使えばいいじゃない
666 名前:デフォルトの名無しさん mailto:sage [2012/06/09(土) 01:11:55.09 ] boostで日本提供のライブラリって多いよな 日本優秀だな
667 名前:デフォルトの名無しさん mailto:sage [2012/06/09(土) 01:12:53.39 ] たとえば?
668 名前:デフォルトの名無しさん mailto:sage [2012/06/09(土) 01:14:28.80 ] boost::sinobi boost::geisha boost::shogun
669 名前:デフォルトの名無しさん mailto:sage [2012/06/09(土) 03:27:19.55 ] boost::harakiri
670 名前:デフォルトの名無しさん mailto:sage [2012/06/09(土) 03:59:45.65 ] boost::fukushima このライブラリは日本の優秀さをみごとに示している
671 名前:デフォルトの名無しさん mailto:sage [2012/06/09(土) 04:21:40.19 ] え?これってマジ?なわけないか
672 名前:デフォルトの名無しさん [2012/06/09(土) 22:08:27.44 ] 最近アクセスしたデータを高速に取出し、 アクセス頻度の低いデータをちゃっちゃと 削除する(所謂キャッシュ)のに、適した STLコンテナーの組み合わせってなんだろうか? 大量の配列からデータを検索するんだが、 その検索速度よりは、速くしたい。
673 名前:デフォルトの名無しさん mailto:sage [2012/06/09(土) 22:23:21.20 ] priority_queueとか
674 名前:デフォルトの名無しさん mailto:sage [2012/06/09(土) 22:30:55.99 ] 言ってる事はLRUアルゴリズムの事だと思うんだけどこれをSTLでするにはなあ LRU STL でぐぐってみたら?
675 名前:デフォルトの名無しさん mailto:sage [2012/06/09(土) 22:49:25.47 ] >>672 こんなのは? timday.bitbucket.org/lru.html
676 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:07:32.88 ] >>675 商用なんで、そんな得体の知れない、何の保障もないものは使えないんですよ
677 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:12:42.90 ] スプレー木自作コースだな バグ多発のヨカーン
678 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:14:14.01 ] >>676 2chで金取るような質問すんなよ そこまで言うなら自分で考えな
679 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:21:08.76 ] スプレー木 Boost にあるじゃん
680 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:21:59.97 ] >>679 商用なんで、そんな得体の知れない、何の保障もないものは使えないんですよ
681 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:22:45.47 ] >>675 ありがとうございます。もっと詳しく調べてみようと思いますが キャッシュ管理コスト自体が重そうですね・・・
682 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:24:13.85 ] dllが複数のアップリケーションから読み込んで使われるとして、そのdllの別々のインスタンスに共通のデータを持たせる方法はありますか? 具体的には、読み込まれたdllのインスタンスが自分が何番目のdllインスタンスなのかを知ることができるかどうかなのですが HD書き込みよりも直接的な方法で
683 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:26:56.11 ] 共有メモリ
684 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:30:58.11 ] >>682 templateのinstanceは共有できんぞ 単に変数とか記憶領域の事をいってんならMemory-Mappedか、 data_segをつかう↓。ただし処理系依存だし、addressも制御できんから 特別事情がない限りMemory-Mappedを使うべき msdn.microsoft.com/ja-jp/library/h90dkhs0 (v=vs.80).aspx
685 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:31:33.01 ] >>683 ありがとうございます、ググっていけばなんとかなりそうな雰囲気がつかめました これって言語レベルで使えるものなんですかね?
686 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:40:59.55 ] >>684 更にありがとうございます チラッとし食べてみた感じ言語レベルで使えそうですね、ありがたい
687 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:44:43.61 ] class nekoあったとして 下記をやるために用意しなければいけないnekoのメソッドって何ですか? const char* koe = "wan"; neko pochi = neko(koe);
688 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:46:02.33 ] メモリポインタ
689 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 00:46:56.73 ] C++は関数はあってもObjective-Cの様にメッセージの対になるメソッドは持っていない
690 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 03:01:36.67 ] C++11じゃない場合は is_rvalueで条件文分岐するのは無理なのでしょうか boostの中にもis_rvalueないみたいですし 例えばこんなことしたい template<T> struct glue { T & value glue(T & v):value(v) {} }; template<> struct glue<rvalue<float> > { float value; glue(float v):value(v) {} }; float f=10.2; glue<float> g1(f); glue<rvalue<float>> g1(2.3);
691 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 03:58:06.88 ] それだけだとこれでいいように見える template<T> struct glue { T value glue(T v):value(v) {} }; float f=10.2; glue<float&> g1(f); glue<float> g1(2.3);
692 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 12:58:03.71 ] boost.moveにrvalue判定できるマクロあったよね
693 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 20:37:33.46 ] C++の標準STLって覚えたほうがいいのか
694 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 20:38:47.45 ] STL覚えてないってことはC++の基本すら習得出来てないってことだろ
695 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 20:45:12.22 ] >>694 なるほど
696 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 21:10:27.44 ] インターフェースクラスのGetメソッドで サブクラスのフィールドのオブジェクトポインタを 返したいんだけどどうしたらいいですか? インターフェースクラスは複数のサブクラスに継承されて、それぞれのオブジェクトの定格は違う
697 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 21:29:30.05 ] コンパイル通らなくてもいいから どんなことしたいかソース書いた方がいい
698 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 21:45:35.96 ] >>694 C++に詳しそうだから聞こう。std::messageってLinuxだと gettextと同じカタログファイルでいいんだが、 windowsだと、どこのカタログから文字列取ってくるんだ?
699 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 21:54:16.40 ] STLならともかくlocale系なんてまともに使ってる人いるんだろうか
700 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 21:56:41.90 ] 多言語対応は大抵ICUまかせ
701 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 21:58:09.30 ] localeはvactor<bool>ぐらいのうんこ
702 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 22:12:53.22 ] >>697 あっ メソッドのおしりに=0をつければサブクラスでそのメソッドを定義できるんですね ありがとうございました
703 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 22:13:18.02 ] >>697 あっ メソッドのおしりに=0をつければサブクラスでそのメソッドを定義できるんですね ありがとうございました
704 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 22:15:22.58 ] メッセージカタログの仕様、MSDNで探しても見つからんな… つかVC++の日本語localeはゴミみたいな仕様なのでもしかしたら未実装なのか?^^
705 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 22:21:21.59 ] ttp://cpplover.blogspot.jp/2010/06/clocale.html ttp://cpplover.blogspot.jp/2011/04/boostlocale.html
706 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 22:28:38.43 ] std::message ←
707 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 22:47:28.40 ] >>704 stdcxx.apache.org/doc/stdlibref/messages.html#sec12 en.cppreference.com/w/cpp/locale/messages に書いてある rwstdmessages.catや/usr/share/locale/de/LC_MESSAGES/sed.moを探してみたら?
708 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 23:04:06.31 ] インタフェース インターフェース インタフェイス インターフェイス どれ派?
709 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 23:08:32.63 ] >>697 じゃなかった、返り値の型が定まらないです。 class Interface{ public: virtual Object GetObject() = 0; }; class hoge:Interface{ Object obj; public: hoge(Object obj):this.obj(obj){} };
710 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 23:15:37.27 ] >>708 google 約 1,510,000 件 約 3,400,000 件 約 363,000 件 約 2,550,000 件
711 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 23:19:41.67 ] >>710 yahooにしろよ
712 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 23:22:30.47 ] ヤホーで調べました
713 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 23:29:12.97 ] >>709 よく分からんけどこういうこと? ideone.com/jC5TY それとも class hoge:Interface{ HogeObject obj; とかになるってこと?
714 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 23:32:46.96 ] >>713 それっぽいけど、Objectポインタってなんでもいいの? まぁ4バイト固定だからできるんですか。 実際に仮想関数作る時に適当なポインタいれるのは一般的に使われる手法なんですか?
715 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 23:43:56.65 ] >>714 = 0のこと? 4バイト固定でも適当なポインタでもなく 純粋仮想関数を定義するただの構文で、0に数値としての意味は無いよ
716 名前:デフォルトの名無しさん mailto:sage [2012/06/10(日) 23:58:54.33 ] >>701 まともに動かない事もあるしな
717 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 00:01:09.69 ] メモリポインタでいいよ
718 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 00:01:58.47 ] >>715 いや、リンク先の1行目でObjectを定義してて それをポインタとして利用してるから、それはよく使われるのかなーと・・・ 例えるなら、数値データリストクラスと文字データリストクラスがあって、 それぞれ数値データクラスのリストと文字データクラスのリストを持っている。 データクラスのポインタを各リストクラスで共通のメソッドでGetしたいので同じインターフェースクラスを作って継承することにする。 ・・・すると、インターフェースクラスの宣言?のGetメソッドの返り値は、 数値データクラスのポインタも文字データクラスのポインタでも適さないのでは? という感じです。 Object構造体はあくまでポインタを使うための使い捨てするのは一般的な手法なのかなと・・・ わかりにくてすいません。
719 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 00:24:10.23 ] >>718 >それをポインタとして利用してるから structはstructでしかなくポインタではないよ Object ←実体 Object* ←Objectのポインタ &objの& ←アドレス演算子 hogeのメンバobjは実体、hogeコンストラクタのaobjも実体(値渡し) GetObject()の戻り値はObjectのポインタ というところまで分かる? >>709 のObjectはどう扱いたいの?
720 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 08:39:54.15 ] >>719 例えが悪かったです class Interface{ public: virtual ??? GetObject() = 0; }; class hoge:Interface{ ObjectA obj; public: hoge(ObjectA obj):this.obj(obj){} }; class hage:Interface{ ObjectB obj; public: hage(ObjectB obj):this.obj(obj){} }; このような時、InterfaceのGetObjectメソッドの返り値をどのように宣言したらいいのか ということです。 >>713 でいうなら、hogeクラスの他にhuga,hogaクラスがあったとして それぞれの扱うobjの型は違います。
721 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 09:42:53.65 ] 同じように扱えるからinterfaceなのであって、 ObjectAとObjectBが同じinterfaceを持つならそれを返せばいい。 class Object{ public: virtual int GetID() = 0; }; class ObjectA : Object { public: int GetID(){...} }; class ObjectA : Object { public: int GetID(){...} }; class Interface{ public: virtual Object* GetObject() = 0; }; ObjectAとObjectBが同じinterfaceを持たないなら、 そもそもInterface::GetObject()を使って何をしたいか意味不明。
722 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 13:03:15.13 ] ああ、インターフェイスを2個使えばいいという感じですか
723 名前:デフォルトの名無しさん mailto:sage [2012/06/11(月) 20:59:01.80 ] Javaとかの出身なのかなあ
724 名前:デフォルトの名無しさん [2012/06/11(月) 23:54:12.27 ] union foo { int f; }; struct bar { foo a; union { int b; }; }; bar zot; int bar::*p = &bar::b; int x = zot->*p; // is zot.b int bar::*q = XXX; int y = zot->*q; // is zot.a.f これを満たすようにするにはXXXの所どう書けばいいんでしょうか?
725 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 00:12:16.32 ] できないと思う
726 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 00:15:18.44 ] C++ってGUIライブラリが貧弱だよね winのデスクトップアプリを作成するとき皆さんはなにをつかってるの?
727 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 00:24:56.62 ] C++
728 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 00:28:10.44 ] >>724 やっと動いた 思ったより厄介だぞこれ union foo { int f; void operator=(int x) { f = x; } }; struct bar { foo a; union { int b; }; friend std::ostream& operator<<(std::ostream& os, foo& f); }; std::ostream& operator<<(std::ostream& os, foo& f) { std::cout << f.f; return os; } int main() { bar zot; zot.b = 123; zot.a = 456; int bar::*p = &bar::b; int x = zot.*p; // is zot.b foo bar::*q = &bar::a; foo y = zot.*q; // is zot.a.f std::cout << x << std::endl; std::cout << y << std::endl; }
729 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 01:35:48.51 ] なにがしたかったの?やりたいことによってはBoost.Variant使ったほうが楽かも知れんよ
730 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 08:43:54.54 ] >728 qがint bar::*じゃないじゃん。
731 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 09:09:03.00 ] >>730 unionが名前空間じゃないしクラス名でもないから通らないんだって やってみろ
732 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 10:35:05.45 ] >>725 の言うように出来ないだろ。 int bar::*単体でネスト内にアクセスしたいんだろうし。 呼び出し側を変えていいならコピーしなくてもzot.*q1.*q2で十分。 ideone.com/OR9Zp pとqが同じ型であればいいだけなら関数ポインタで似たものにはなる。 ideone.com/22kQL
733 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 10:39:53.63 ] 関数ポインタちょっと訂正(int→int&) ideone.com/KnuVI
734 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 11:01:35.15 ] reinterpret_cast使うしかないな
735 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 11:20:23.42 ] 移植性無視するのか
736 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 12:16:05.92 ] >>728 Boost.Variantを使ってやってみた ttp://ideone.com/cSE2g
737 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 20:15:35.48 ] offsetofとreinterpret_cast使うしか無いな
738 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 21:08:41.94 ] それにしてもunionに名前が付いただけでなんだってこんな面倒な事になるんだろうな
739 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 23:30:49.04 ] unionなんか使うから もともとC++ではunionは型安全でない点で推奨できるものではなかったし 最近では(型を意識しない)ジェネリックなプログラミングにも対応できないしで Cから引き継いでしまった負の遺産といっていいだろ
740 名前:デフォルトの名無しさん mailto:sage [2012/06/12(火) 23:38:09.53 ] >>739 無名構造体が書けるC++11で>>724 のunionを両方ともstructに置き換えても同じことが起きるぜ。
741 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 00:13:25.65 ] それは 無名構造体なんか使うから になるだけでは・・・ というかもともとの話の本質はunionも無名なんちゃらも関係なく 直接のメンバとメンバのメンバを同列に扱いたいけどどうしようという話だよな
742 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 00:18:58.86 ] そういう事ならハンドリング時ラッピングテンプレートクラス+関数を作ればいいんじゃね
743 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 01:46:00.21 ] >>728 >>732 と同じ方向性だが最初からC++っぽい設計にしとけば悩むほうが難しいくらいだったろうに union foo { int f; }; struct bar { foo a; struct { int b; }; int get_f() { return a.f; } int get_b() { return b; } }; int main() { bar zot; zot.b = 123; zot.a.f = 456; int (bar::*p)() = &bar::get_b; int x = (zot.*p)(); // is zot.b int (bar::*q)() = &bar::get_f; int y = (zot.*q)(); // is zot.a.f std::cout << x << std::endl; std::cout << y << std::endl; return 0; }
744 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 14:40:09.67 ] std::list<double &> に相当するものってないの? boost:intrusive がそれっぽいけど doubleとかintとかは扱えないっぽい
745 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 15:58:15.10 ] ある文字列(std::string型)からユニークなIDを作成する静的な方法はないでしょうか。 ある文字列のペアを引数に取ることで自作クラスの実体のアドレスを返す関数、またはクラスを 作りたいと考えています。 Hoge* rtnHoge(std::string a,std::string b){...; return &hoge;}//例 上記のような方法で一度作成したのですが、 ・この方法ではペアの検索に時間がかかる(std::mapを使用しました) ・aとbに入れる文字列はコーディング時に決めうちで入力する の二つの特徴から、 テンプレート等を利用して別途にアドレスを確保する箇所を作成したいと考えています。 テンプレートの特殊化では文字列を受けることができないため、 文字列からint型のユニークなIDを再生することが出来ると思い、その方法を探しています。 もしどなたか良い案などがありましたらアドバイスのほう頂けたら幸いです。
746 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 16:05:28.09 ] crc
747 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 16:22:51.36 ] なぁなぁ。静的ってことはコンパイル時ってことじゃろ? しかしクラスのオブジェクトのアドレスっていうのはコンパイル時にはわかっていないじゃろ。 どうやってMooRieなんじゃないかって気がするんだよね。
748 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 16:24:04.04 ] >>745 CLSIDかSHA256とか
749 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 16:50:14.75 ] >>746 ,748 レスありがとうございます。 CRC,CLSID,SHA256を少し調べてみましたが、動的な方法になってしまいそうですね・・・。 >>747 そうですね、コンパイル時に確定したいと思っています。 テンプレートを使えば template<int ID=0> class Hoge{} Hoge<0>,Hoge<1>,Hoge<2> 上記は全て異なる型として生成されるので、 この中それぞれに別途にシングルトンのようなクラスを生成してアクセスすれば 実現できると考えました。 ですので、静的に、コンパイル時に文字列からユニークなIDが生成できれば・・・と思い、 こちらに質問させていただきました。
750 名前:デフォルトの名無しさん [2012/06/13(水) 16:55:53.76 ] aとbの最大長が固定なら連結してmapのキーにすればいいんじゃないの?
751 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 17:01:30.60 ] >コンパイル時に確定 ・#defineで自分で連番化 ・ユーザー定義リテラル(C++11) ・GNU gettext
752 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 17:01:57.34 ] ユニークなIDが欲しいのはいいとして文字列にこだわる理由が分からん… マクロでも列挙でも定義すればいいと思うのだが… 自分は壮大な勘違いをしているのかな?
753 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 17:39:19.12 ] 文字列のペアとアドレスの対応表を作れ
754 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 17:48:20.74 ] >>749 文字列そのものが動的に変化する性質のものなのになぜユニークなIDが?
755 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 17:54:40.28 ] .NETならSHA1CryptoServiceProviderを使えば簡単に生成できるから stringとSHA1のstructをコレクションに突っ込んでおればいいしな
756 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 17:57:07.63 ] 皆様レスありがとうございます。 >>750 ,753 はじめはmapで実装を行っていたのですが、文字列ですのでどうしても検索速度が気になって・・。 >>751 ,750 やはりマクロか列挙型しかないですか・・・。 実は実行時コンパイルの必要なGLSLのプログラムクラスを作りたいと思っています。 本来ならば以下のようにすれば特に問題ないのですが class Hoge { public: Hoge(){prog.init("foo.vert","bar.frag");} void run() { prog.bind(); ○○何らかの処理○○ prog.unbind(); } private: GLSLProgram prog; }; prog自体はrunの中でしか呼び出さないためメンバ変数として保持するほどでもないので 出来れば以下のようにしたいなと考えています。 void run() { prog("foo.vert","bar.frag");//コンストラクタ、デストラクタでbind,unbindを行う } ただ、prog("foo.vert","bar.frag")自体はほかのクラスでも使うときがあるかもしれないので、 "あるペアに対する実体は一つ"のクラスを作りたい、と考えています。
757 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 17:58:16.34 ] ハッシュはユニークじゃなくね 実用上ユニークと考えて差し支えは無いかもしれないけど
758 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 18:04:18.81 ] メモリを自動的に確保したら intを作る必要なんかないのでは?
759 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 18:05:23.41 ] 多分2倍程度しか早くならないけどhash_mapっていうハッシュ使うマップもあるよ あとはハッシュ関数自前で作ってaとbの命名を被らないように特徴づけるとかすればいいんじゃないの?
760 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 18:08:28.50 ] >>757 衝突する確率はゼロじゃないわな でも文字列も同一文字列である可能性もあるわけで
761 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 18:23:11.70 ] void Hoge::run(){ static id = id_from_map("foo.vert", "bar.frag"); GLSLProgram prog(id); }
762 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 19:02:57.58 ] >>756 ideone.com/B4Sri cache find, new glsl_bodyは2回、bind,unbindは4回 文字列での検索は関数毎に1回だけ コンパイル時じゃないけど初回くらいいいだろうということで
763 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 22:06:36.71 ] 無料ではじめたい、無料でソフトつくりたい・・・はやっぱり贅沢すぎるか・・・
764 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 22:24:01.97 ] PCと電気代、通信費以外は無料でプログラム作れるぞ? 回線も一昔前のISDN時代とは違うしな。
765 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 22:46:02.09 ] PCもネットも無料で使える図書館的なものが欲しいって話かと思った
766 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 22:47:27.45 ] Visual Studio の無料版なくなったってよ
767 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 22:48:51.21 ] 情弱乙
768 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 22:53:15.51 ] 提供されないよ!って大風呂敷広げた記事が数日で訂正されてたのには笑った
769 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 22:59:02.78 ] 仮にVSなくなろうとPlatform SDKかWindows SDKもしくは、gcc使えば済むしな お勉強したいだけなら、cintやcodepad使う手もある
770 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 23:01:54.02 ] テキストに「ド、レ、ミ」と入力してMIDIファイルを書き出すソフトって難しそうだ
771 名前:デフォルトの名無しさん [2012/06/13(水) 23:07:47.88 ] 一応ここでいいかな? mp3だとかwavみたいな音楽ファイルから、 タイトルとかアルバム名を取れるライブラリってないかな?
772 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 23:19:17.89 ] mp3infp
773 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 23:35:31.84 ] >>772 ありがとう。 とりあえずこのプログラムから解析してる部分の抜き出しをがんばってみる。
774 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 23:36:17.30 ] テンプレート関数の事なのですが、 戻り値が引数と同じ型で、 かつ特殊化をするコードを教えていただけませんでしょうか。 C#でのコードだと↓です public T getObject<T>() where : Hoge { ~~~~~~ ~~~~~~ return T; }
775 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 23:43:01.91 ] 引数ないじゃん
776 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 23:45:50.36 ] すみません説明不十分でしたorz テンプレート引数です。
777 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 23:48:22.98 ] template <> Hoge getObject() { /* */ } 特に悩むところもないと思うけど
778 名前:デフォルトの名無しさん mailto:sage [2012/06/13(水) 23:57:26.61 ] >>756 究極的には文字列を分解して一文字ずつテンプレートに渡す方法だな template<char C1, char C2 ・・・ > hoge; hoge<'f', 'o', 'o'> h; 11ならconstexprと組み合わせて文字列から↑まで持っていくのも不可能ではなさそうなんだが実際できるのかな?
779 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:05:36.70 ] boost::mpl::stringみたいな魔境に近づくのはやめようぜ
780 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:09:44.66 ] >>777 それはちょっと違うと思う 特定の型から派生されているかの制約を持たせたいなら メタプロでなんとかなると思われ C++11 なら std::is_base_of ってのがあるが C++11 でなくても真似すればいいと思う
781 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:19:00.62 ] >>744 list< shared_ptr<double> >
782 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:20:07.66 ] >>777 すみません。また説明不足でした。すみません。 >>778 関数の処理結果に応じて戻り値の型を変える事ができるのでしょうか?勉強不足ですみません。 説明不足で申し訳ありません。 ↓のような場合の時でテンプレート引数がHogeの派生クラスになるように制約をかけたいです。 class Hoge() { public T getObject<T>() where T : Hoge() { ~~~~ ~~~~ return T; } } class Poge() : public Hoge { } class Foge() : public Hoge { } >>780 メタプロでぐぐってみます。
783 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:22:39.49 ] boostにis_base_ofがあるな BOOST_STATIC_ASSERTと組み合わせて使えばいいはず
784 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:25:59.51 ] template <typename T> typename std::enable_if<std::is_base_of<Hoge, T>::value, T>::type getObject(){return T();}; こうだろ
785 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:28:09.48 ] enabled_ifはキモいなあ 今回はたまたま戻り値の型でしかTが使われてないけど 2箇所以上で使われている場合に 1箇所だけenabled_ifってのも何かバランス悪いし
786 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:28:38.38 ] enable_ifだよ ミスったよ
787 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:41:45.51 ] boostなんて実用はありない あんなのヲタが使うもの ソースが汚くいことこの上ない
788 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:47:04.52 ] 自分が使いこなせないからってライブラリのせいにする人はちょっと…
789 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:53:53.73 ] >>784 今さっきなんとなくわかりました。長いのは戻り値だったんですねー… Boostをインストールしてみて、 きびしそうなら別の方法を執ってみます。 みなさんわざわざありがとうございました。
790 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 00:56:23.34 ] >>788 使いこなせないとどこに書いてあるんだ? 脳内補完もここまで来ると感服だなw
791 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 02:38:33.34 ] STLにTree構造データないのは何故だ
792 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 03:04:06.37 ] Setは?
793 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 04:11:05.53 ] ありない ありない ありない 汚くい 汚くい 汚くい
794 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 06:05:26.57 ] >>780 そんな事するんだったらconst定数使った方がましじゃね? template<const char *array> class Example; namespace Keys { const char alpha[] = "Alpha"; const char beta[] = "Alpha"; } Example< Keys::alpha > object; >>782 template<class type> type Example::Function() { type value; ExampleBase *base_check = &value; // 親子関係がなければコンパイルエラー return value; }
795 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 06:27:38.53 ] >>791 map, set, priority_qeueは内部的にtree使ってる std::make_heapを使えば自前の二分木を楽に作れる
796 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 08:43:30.62 ] class Object {}; class User { public: User(std::shared_ptr<Object> o = std::make_shared<Object>()) : o_(o) };
797 名前:796 mailto:sage [2012/06/14(木) 08:45:31.56 ] すみません、記述途中で投稿してしまいました。 デフォルト引数にstd::make_shared〜とやると、make_sharedがglobal namespaceのメンバーでないとエラーが出てしまいます。 当然、using namespace std;を行うと、正しくコンパイルできるのですが、それはしたくありません。 どのように記述するのが正しいのでしょうか?
798 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 09:24:56.76 ] VC++が悪い
799 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 10:06:41.32 ] そのコンストラクタはデフォルト引数の指定無しにして引数なしのコンストラクタも書けばいいじゃないか
800 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 11:35:13.06 ] こんなのはどう? User(std::shared_ptr<Object> o = [](){return std::make_shared<Object>();}()) : o_(o) {}
801 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 11:44:08.99 ] >>769 そもそも勉強用にMSVC使うってのが間違ってるだろ。 LLVM/clang使えばいろいろ捗るぞ。ここまで無料で高品質でライセンスの緩いコンパイラは珍しいし他にない。 本来ならば金の要らないLinux前提だしmingw入れればwindowsでも動くしな。
802 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 11:54:10.94 ] Linux前提やクロス開発を考慮する場合はともかく Windows前提ならmingw選ぶのは間違ってる
803 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 12:40:59.56 ] windows使ってるならcygwin入れろ。 ファイル消せなくなって困るぞ。
804 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 12:45:48.23 ] 問題なのはcygwinを入れないとファイルが消せなくなるんじゃなくて cygwinを入れたせいでファイルを消せなくなる点なんだよな。
805 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 12:49:49.76 ] Windows前提をはずすのが一番って尊師が言ってた
806 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 13:30:06.78 ] そりゃあ尊師はUNIXライク前提ですから
807 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 13:52:33.44 ] cygwin()
808 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 16:22:24.28 ] マハーポーシャでPC組んでLinux入れよう
809 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 18:03:24.84 ] LinuxはTagジャンプをなんとかしろ global.elとか仕様頻繁に換えんな
810 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 18:28:20.78 ] カーネル開発者や鳥のメンテナにEmacsの文句言うのかー
811 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 19:22:16.79 ] C++で、外部の.exeファイルを実行するにはどうすればいいですか? 使っているソフトはVS2010です
812 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 19:30:59.40 ] >>811 【初心者歓迎】C/C++室 Ver.78【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1331894668/l50
813 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 19:39:57.21 ] 環境依存でないsystemがあるじゃないかー (使い方はある程度環境に依存はするけど)
814 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 19:41:19.39 ] #include <cstdlib> int std::system(const char*); のことかな。
815 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 20:37:55.88 ] >>811 単に実行するならexecとか 標準入出力の内容を操作したいならpopen/_popenを使ふ
816 名前:デフォルトの名無しさん mailto:sage [2012/06/14(木) 22:05:13.07 ] そんな環境依存の事を言われても・・・
817 名前:デフォルトの名無しさん mailto:sage [2012/06/15(金) 22:09:00.46 ] popenか_popenどっちも持ってないなんて組み込み環境ぐらいだろ
818 名前:デフォルトの名無しさん mailto:sage [2012/06/15(金) 22:24:09.16 ] 規格に無いものは開発環境ごとのスレでやった方がいい
819 名前:デフォルトの名無しさん mailto:sage [2012/06/15(金) 22:26:06.03 ] POSIXぐらい、半標準なんだからいいだろうに 標準ライブラリなんて元々POSIXのサブセットだぞ
820 名前:デフォルトの名無しさん mailto:sage [2012/06/15(金) 22:35:30.41 ] pthreadsもここでやるのか?とか あまり手広く広げてもなあ
821 名前:デフォルトの名無しさん mailto:sage [2012/06/15(金) 22:49:13.90 ] posix名前空間が用意されたとはいえ 現状std名前空間にあるC関数もあんまり積極的には扱ってないだろ
822 名前:デフォルトの名無しさん mailto:sage [2012/06/15(金) 23:06:35.34 ] C関数でないと無理なものはまあ扱わなくもない