C++相談室 part78
..
751:デフォルトの名無しさん
10/03/11 01:55:22
URLリンク(homepage2.nifty.com)
752:デフォルトの名無しさん
10/03/11 02:06:36
結合力最強の二項演算子なので
マクロとかで細工するときに便利なこともあります
753:デフォルトの名無しさん
10/03/11 02:24:57
>>751
どうもです
しかしなんだこれって感じですね
ポインタエミュレートのために
(myp_hoge->*(&MyPtr<hoge>::Func))(a, b, c);
といった形で使いたいんですが、定義の仕方が分からないです(->なら簡単なんですが・・・)
>>752
そういう特殊な使い方ってよく思いつくもんですよね
754:デフォルトの名無しさん
10/03/11 03:03:47
>>748
徹底したクラス指向で行くならこの程度のものになる。
int main()
{
MainClass m;
return m.main();
}
755:デフォルトの名無しさん
10/03/11 04:20:39
int main()
{
return MainClass()();
}
徹底するならこうだろーと思った俺はそろそろ寝るべきか
756:デフォルトの名無しさん
10/03/11 04:51:32
operator RESULT(); //用意するだろ普通
757:デフォルトの名無しさん
10/03/11 16:29:37
throwでint投げると問題があるようなことを聞いたのですが、
どんな問題があるんでしょうか?
ポインタでキャッチしてしまうとか?
758:デフォルトの名無しさん
10/03/11 16:33:36
受け取る方はみんなstd::exceptionを継承してて欲しいなーって思ってるから
759:デフォルトの名無しさん
10/03/11 16:44:47
なるほど。よくわかりました。
760:デフォルトの名無しさん
10/03/11 17:01:56
istringstream の putback って何回でも呼んでおk?
761:デフォルトの名無しさん
10/03/11 21:28:31
boost::functionとstd::functionって混在しても問題ありませんか?
それともどちらか一方にすべきでしょうか?
762:デフォルトの名無しさん
10/03/11 21:54:55
混在させたこと無いからわからんけど、大丈夫じゃね?
どっちも最終的にはただの関数オブジェクトになるわけだから
boostのほうにstdのfunctionを代入することも逆もできるはず
名前は名前空間があるからかぶるわけないし
763:デフォルトの名無しさん
10/03/11 22:54:37
ABI互換性は?
764:デフォルトの名無しさん
10/03/11 23:03:33
混在といっても、ひとつのコンパイラでコンパイルするんだからABI関係なくね?
765:デフォルトの名無しさん
10/03/11 23:15:46
namespace boost = std ;
766:デフォルトの名無しさん
10/03/11 23:28:03
ありがとうございます。
今のところはboostが使えるならboostが無難かと
思うのでboostにします。
767:デフォルトの名無しさん
10/03/11 23:34:01
>>766
えぇーーー
普通は逆でしょ
標準で済むなら標準を使うのが筋でしょ
768:デフォルトの名無しさん
10/03/11 23:38:24
>>767 std::function はまだ標準じゃないでしょ。
769:767
10/03/11 23:40:20
>>768
そりゃそうだ
boost と std だけ見て function を見てなかったよ
770:デフォルトの名無しさん
10/03/11 23:48:14
>>766も「今のところは」って言ってるしな。
771:デフォルトの名無しさん
10/03/12 01:27:32
placement newを使わずに、任意のメモリ領域にコンストラクタを呼ぶことは不可能?
772:デフォルトの名無しさん
10/03/12 01:30:56
>>771
何がしたいのかわからないけど、コピーでいいなら std::allocator::construct() とか
std::uninitialized_copy() とかが使えるんじゃない?
773:デフォルトの名無しさん
10/03/12 10:16:48
template <class T> void Caller( T &f ){ f(); }
に対して、
void Callee();
があり、
Caller( Callee ); // これだとコンパイルが通るのに、
Caller( &Callee ); // こっちは通らない
のはなぜですか?
774:デフォルトの名無しさん
10/03/12 10:40:58
URLリンク(codepad.org)
それはポインタだからさ
775:デフォルトの名無しさん
10/03/12 20:32:25
関数の引数に配列の参照を渡したいんですが、どうすればいいですか
776:デフォルトの名無しさん
10/03/12 20:54:16
>>774
サンクスです。
T &fは「関数の参照型」と言えばいいんでしょうか?
また、関数ポインタを呼ぶ際は、
(*f)(); //デリファレンスあり
f();//なし
2通りで呼べますが、これはシンタックスシュガー的なものですか?
どっち使ってもOKですか?
777:デフォルトの名無しさん
10/03/12 20:54:42
template<typename T, size_t N> void func(T (&x)[N])
778:デフォルトの名無しさん
10/03/13 00:39:50
typedef std::deque<int>::iterator iterator;
iterator tekitou;
//...
tekitou == iterator(); //tekitouに代入処理がなかったらtrue
を期待して組んでたら例外が発生してパソコンが爆発したんですけど
tekitouがデフォルトコンストラクタ走ったまま何も触られて無いかどうかを判定する方法はありませんか?
779:デフォルトの名無しさん
10/03/13 00:52:18
>>778
パソコンが爆発するプログラムを作っているんだったら
いますぐやめなさい。
780:デフォルトの名無しさん
10/03/13 00:53:54
パソコンが爆発するプログラムを作っているのではありません。
パソコンが爆発するのを防ぐプログラムを作っているのです。
781:デフォルトの名無しさん
10/03/13 01:15:50
爆発させるプログラムにも実に巧妙なメカニズムがあってだな・・・
782:デフォルトの名無しさん
10/03/13 01:17:30
兎に角、例外が発生してプログラムが正常に動作しないと爆発を防ぐ事ができないのです。
ご教示いただけないでしょうか?
783:デフォルトの名無しさん
10/03/13 01:20:26
判定する方法は無い
ポインタと違ってイテレータにはNULL入れられないからねぇ
int *ptr = 0;
784:デフォルトの名無しさん
10/03/13 01:21:45
本当に爆発するというなら、
本題なんてどーでもよくて、爆発させる方法を知りたい気すらする。
785:デフォルトの名無しさん
10/03/13 01:22:35
bool変数でも使って対処しとけ
786:デフォルトの名無しさん
10/03/13 01:24:23
std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, bool>, param>って書かなきゃいけなくなったわ・・・
787:デフォルトの名無しさん
10/03/13 01:25:48
こういうときは boost::optional だっけ?
788:デフォルトの名無しさん
10/03/13 01:26:47
つtuple
789:デフォルトの名無しさん
10/03/13 01:30:12
end()をNULL代わりにしたらあかんの?
790:デフォルトの名無しさん
10/03/13 01:32:49
今回もそうでしたが、コンテナを特定できないとそれは使えません。
791:デフォルトの名無しさん
10/03/13 01:55:44
じゃあNULL用の適当なコンテナ作ればいいじゃん
792:デフォルトの名無しさん
10/03/13 01:58:30
std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, dummy_container>, param>って書かなきゃいけなくなったわ・・・
793:デフォルトの名無しさん
10/03/13 01:59:08
nil使えよ
794:デフォルトの名無しさん
10/03/13 02:06:15
iteratorがコンテナと関連付けられてるかチェックしたいってことなのかな?
わざわざややこしいことやってるように見えるけど
795:デフォルトの名無しさん
10/03/13 02:43:02
namespace boost {
namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;
} // namespace boost
namespace boost {
none_t const none = ((none_t)0) ;
} // namespace boost
このコードはいったい何をしようとしてるわけ?
796:デフォルトの名無しさん
10/03/13 02:55:22
ググった?
797:デフォルトの名無しさん
10/03/13 04:11:26
>>795
他のどんな型からも自動変換されないし、
他のどんな型へも自動変換されないような変数を定義してるんじゃね?
798:デフォルトの名無しさん
10/03/13 06:23:39
>>468といい>>778といい、最近のPCは爆発しすぎだな
799:デフォルトの名無しさん
10/03/13 06:27:14
俺のPCは蒸着するぜ0.05秒で。
800:デフォルトの名無しさん
10/03/13 06:52:58
手荷物どころかそのうち航空貨物での取り扱いも断られる
801:デフォルトの名無しさん
10/03/13 07:31:03
そして単純所持禁止へ
802:デフォルトの名無しさん
10/03/13 07:33:53
コンピュータが爆発するって
昔の映画や漫画によくあったな
803:デフォルトの名無しさん
10/03/13 07:52:27
「映画の中のコンピュータ」って
ジョークがあったな
804:デフォルトの名無しさん
10/03/13 08:20:38
「なお、このPCは自動的に消滅する」
805:デフォルトの名無しさん
10/03/13 10:22:54
>>799
あれってさリュック背負ってたりするとセムシ形状に成ったりするん?
806:デフォルトの名無しさん
10/03/13 12:27:14
>>795
なんだこれ超ムズイじゃねぇか。
807:デフォルトの名無しさん
10/03/13 13:03:28
pointer to memberって使ったことあんましないからわからんけど
ほかのpointer to memberじゃないとキャストできない(void *にreinterしても変換できなかった)から他の型と比較できない
なおかつメンバが空だからnullしか入れるものがない
したがってただひとつの状態を持てるってことかな
C++ってこういう気持ち悪いバッドノウハウ多すぎるよね
すなおに仕様でnil型導入すればいいのに
808:デフォルトの名無しさん
10/03/13 13:26:04
一般的な実装上の都合からいうと、
メンバへのポインターは、単なるオフセットに過ぎない。
809:デフォルトの名無しさん
10/03/13 13:30:01
null_ptrをお待ちください
810:デフォルトの名無しさん
10/03/13 17:15:12
>>807
実装上の都合を言語ユーザに押し付けてる感はあるな
811:デフォルトの名無しさん
10/03/13 19:14:16
>>810
812:デフォルトの名無しさん
10/03/13 19:16:22
ごめん、途中で送信してしまった。
>>810
他の言語はともかく、
余計なオーバーヘッドを嫌うC++なら、こういう制限も許される(むしろ歓迎される?)よね。
813:デフォルトの名無しさん
10/03/13 19:38:24
>>810
型変換については妥当な話だと思うし、 nil の不在は実装上の都合ではないだろうし、
何のことを言ってるの?
814:デフォルトの名無しさん
10/03/13 21:11:09
void Test(int *array) {
// ごにょごにょ(配列の長さについては考えないとする)
}
みたいな関数があったとき、
int array[3] = {0,0,0};
Test(array);
はコンパイルできるのに、
Test({0,0,0});
はコンパイルできない。
配列に付ける名前が不足しちゃうのでなんとか名前を付けずにやりたいんだけど、
良い手段ない?
それともなんでもいいからとりあえず名前を付けざるを得ないんだろうか。
815:デフォルトの名無しさん
10/03/13 21:18:13
名前付けないと可読性下がりそう
816:デフォルトの名無しさん
10/03/13 21:21:19
>>814
C++0x をお待ちください。
名前が不足するとかいうのがよくわからんが、マクロでスコープきったり、必要なら
__LINE__ あたりとくっつけとけばよかったりしない?
C++0x 全部じゃなくても、 gcc みたいに C99 の機能が取り込まれてるコンパイラなら
↓こんなのが使えたり。
void Test(int *array);
#define TEST(...) do { int array[] = __VA_ARGS__; Test(array); } while(0)
void Tests()
{
TEST({1,2,3});
TEST({4,5,6});
TEST({7,8,9});
}
817:デフォルトの名無しさん
10/03/13 21:26:22
可変長引数マクロ関数使えるのか
818:デフォルトの名無しさん
10/03/13 21:26:36
>>814
ヘルパー関数を使って、
std::vector<int> make_vector(int num, ...);
Test(&make_vector(3,0,0,0)[0]);
とか、
Test((int*)"\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00");
などの悪手しか思いつかない。
819:デフォルトの名無しさん
10/03/13 21:26:59
配列リテラルとかLL出身者っぽい要望だなぁ
820:デフォルトの名無しさん
10/03/13 21:31:05
>>816
レスありがとうございます。
> 名前が不足するというのがよくわからん
Testを沢山呼ぶんですよ。
それで、
int array1[3] = {0,0,0};
Test(array1);
int array2[3] = {0,0,1};
Test(array1);
int array3[3] = {0,0,2};
Test(array1);
以下大量に。
(実際は配列の中身はもっとぐしゃぐしゃで、規則性はないデータになる)
__LINE__をつけるというのはいいですね。
>>818
レスありがとうございます。
STL不勉強のためすみませんが今はちょっとよくわかりません。
>>819
はい・・・LL出身です・・・。
とりあえず__LINE__くっつける方法で行きたいと思います。ありがとうございました。
821:デフォルトの名無しさん
10/03/13 21:31:50
>>820
なんかTestの引数が全部array1になっちゃってますが、
2回目はarray2、3回目はarray3です・・・。
822:デフォルトの名無しさん
10/03/13 21:36:44
C99にはズバリの機能(複合リテラル)があるのだが、C++0xに入るとは聞いていない。
Test((int[]){0,0,0});
823:デフォルトの名無しさん
10/03/13 21:37:24
二次元配列にすればいいだけなんじゃない
int arys[100][3];
for(int i=0;i<100;++i){
arys[i][0]=0;
arys[i][1]=0;
arys[i][2]=i;
test(arys[i]);
}
824:デフォルトの名無しさん
10/03/13 21:40:22
>>822
std::initializer_listが入る
825:814
10/03/13 21:41:00
>>823
>>820でちょこっと書きましたが、実際には配列のデータはもっとぐしゃぐしゃで、
必ずしも
arys[i][0]=0;
arys[i][1]=0;
arys[i][2]=i;
となるわけではないのです。
質問のために簡略化しているので・・・すみません。
826:デフォルトの名無しさん
10/03/13 21:44:44
それなら読み込めばいいんでは?
int arys[100][3];
for(int i=0;i<100;++i){
cin >> arys[i][0] >> arys[i][1] >> arys[i][2];
test(arys[i]);
}
これは標準入力だけど、別にファイルからでもいいし
827:814
10/03/13 21:50:09
>>826
そうした方がいいでしょうかね・・・大量のデータをソースコードにべた書きするのは
よくないかなぁと思ったんですが、
データをあまり見られたくないんですよ。
それで、別ファイルにするよりはソースコードに埋め込んだほうがどちらかというと
見られにくいかなぁと思ったので。
別にソースに埋め込んでも見ようとすれば見れるのでなんてことはないんですが。
828:デフォルトの名無しさん
10/03/13 21:54:44
慣れたLLでコードジェネレートしればいいじゃない
829:814
10/03/13 21:57:51
>>828
なるほど、考えてみます。ありがとうございます。
830:デフォルトの名無しさん
10/03/13 21:58:14
>>827
__VA_ARGS__ は使えんのか? >>816 にあるやつ。
831:814
10/03/13 22:02:11
>>830
Visual C++ 2008なので使えると思います。
考えてみます。
832:デフォルトの名無しさん
10/03/13 22:04:48
>>820
int *arrays[] = {
{ 0,0,0 },
{ 0,0,1 },
{ 0,0,2 }
};
みたいなのじゃダメなの?
argv と同じやりかた。
833:デフォルトの名無しさん
10/03/13 22:07:18
>>832 コンパイルしてみてから言おうな。
834:デフォルトの名無しさん
10/03/13 22:14:19
めんどくせw
835:デフォルトの名無しさん
10/03/13 22:19:38
>>816
__LINE__とくっつけたとして、どうやって参照するの?同じ行が前提?
836:デフォルトの名無しさん
10/03/13 22:50:27
>>835
同じ行に書くか、ひとつのマクロ内であれば問題なく使えるでしょ。
この場合は単にスコープ分けるだけでも済みそうだし、
__VA_ARGS__ が使えるなら >816 のやつがいいと思う。
837:デフォルトの名無しさん
10/03/13 22:58:41
つーか規則性の無いグシャグシャなデータにしたのがそもそも間違いだろ。なんで誰も突っ込まないんだよ
データってのは規則正しい形式なのが当たり前で、規則正しいからこそコードを簡潔に記述できるんだよ
struct Recode
{
int num[5]; char str[80];
};
Recode recodes[N] =
{
{〜},
{〜},
};
for(int i = 0; i < N; ++i) Test(recodes[i]);
こんな感じに書くのが基本に忠実な答え
まずはデータ形式から見直そう
838:デフォルトの名無しさん
10/03/13 23:08:15
>>837
int の配列って言ってるだろ。十分なデータ構造じゃないか。
規則性がなくてぐしゃぐしゃなのは配列の中の値だろ。
839:デフォルトの名無しさん
10/03/13 23:20:29
(データ長+データ実体)*nを1次元配列で持つとか
840:デフォルトの名無しさん
10/03/13 23:24:19
質問のために簡略化してるって構造のことじゃなくて値のことだったのか?
だったら二次元配列を使おう、でおしまいだね。いったい何を悩んでるんだろう
841:814
10/03/13 23:52:42
Visual C++ 2008ってC99は未だっぽいようです・・・
つまり複合リテラル>>822も可変長引数マクロ関数>>816も無理のようです。
>>840
構造も、値も、です。
>>814にかいたTestは実際はオブジェクトのコンストラクタなのですが、これの定義は
CTest::CTest(int Id, const char* Name, const char* Species, const char *Sex, int* Hp_max, int* Attack, int* Speed)
: (メンバ初期化リスト省略) {}
と、>>814で挙げました配列は3つ、さらに文字列や整数値が引数にあります。
で、これのインスタンスを5個ほど作る処理を書きたいのです。
多次元配列を用いようとすると、Hp_maxとAttack、Speedをまとめて記述し、IdやName,Speciesなどの値と離れて記述する
ことになります。できればインスタンス毎にまとめておきたいのですが・・・
842:デフォルトの名無しさん
10/03/14 00:07:58
実際にどう記述してるのか分からん
843:814
10/03/14 00:09:58
一応締切?とさせていただきます。
レスを頂いた皆さま、大変参考になりました。ありがとうございました。
844:デフォルトの名無しさん
10/03/14 00:14:23
>>841
じゃあ
struct X {
int Id;
const char* Name;
const char* Species;
const char* Sex;
int Hp_max[N];
int Attack[M];
int Speed[O];
};
X xs[] = {
{1, "a", "b", "c", {1, 2}, {3, 4}, {5, 6, 7}}
};
では?
845:814
10/03/14 00:24:12
>>844
メンバ変数のうち、Id、Name、Hp_max、Attack、Speedは親クラスから継承しているメンバなのです。
親クラスが存在するクラスではそういう書き方はできなかったかと・・・
846:844
10/03/14 00:28:37
>>845
初期化用データの格納用に >>844 の X のような構造体を定義すれば
初期化データをすっきり記述できるんじゃないかってこと
847:デフォルトの名無しさん
10/03/14 00:28:58
データ部分は関係ないだろ
848:デフォルトの名無しさん
10/03/14 00:30:13
>>827
どれくらい見られたくないのかにもよるけど、別ファイルにしてスクランブルかけた方が見られにくいよ
849:デフォルトの名無しさん
10/03/14 00:35:39
>>841
ひでぇ。最初っからそう聞けよ。 >814 みたいにしたせいで無駄なレスがあんなに。
850:デフォルトの名無しさん
10/03/14 00:35:49
コンストラクタを一つ増やせってことじゃない?
851:デフォルトの名無しさん
10/03/14 00:37:51
>>845
CTest::CTest(const X &init) : m_id(init.id), ・・・
{
}
852:814
10/03/14 00:38:12
>>849
すみません。私の聞き方が悪かったせいで、これ以上続けても私が質問したいことを上手く書けるか分かりませんので、
これで終わりにさせてください。
乱暴なようで申し訳ないのですが、以後レスは致しません。
853:デフォルトの名無しさん
10/03/14 00:38:22
warota
854:デフォルトの名無しさん
10/03/14 00:39:42
┌─┐
|も.|
|う |
│来│
│ね│
│え .|
│よ .|
バカ ゴルァ │ !!.│
└─┤ プンプン
ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ ( `Д)
| ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ ◎−>┘◎
855:デフォルトの名無しさん
10/03/14 00:41:22
gccのC99拡張機能を有り難がって使ってんじゃねーぞ
聞く方が混乱するだけだ
856:デフォルトの名無しさん
10/03/14 00:42:56
えっ
857:デフォルトの名無しさん
10/03/14 01:15:29
template <int num_of_args> class hoge
{
void operator () (int a1, int a2, ...);
};
num_of_argsに対応してoperator ()の引数の数を変動させたいのですが、特殊化をジェネレートするほかにいい方法は無いですかね?
858:デフォルトの名無しさん
10/03/14 01:22:48
>>857
「ジェネレート」がコンパイル以外のプロセスを指しているのなら、 Boost.Preprocessor が
いくらかマシな手段となるかもしれない。
859:デフォルトの名無しさん
10/03/14 01:23:52
>>857
これじゃダメっすか
template<int N> class hoge {
void operator()(int a) { BOOST_STATIC_ASSERT(N == 1); }
void operator()(int a, int b) { BOOST_STATIC_ASSERT(N == 2); }
void operator()(int a, int b, int c) { BOOST_STATIC_ASSERT(N == 3); }
};
860:デフォルトの名無しさん
10/03/14 01:26:06
>>857
C++0xを、首を長くして待て。
861:デフォルトの名無しさん
10/03/14 01:28:23
きりんさんになっちゃいそうです><
862:デフォルトの名無しさん
10/03/14 01:38:21
>>857
num_of_argsが要らなくない?無いほうがすっきりしないか?
863:デフォルトの名無しさん
10/03/14 01:55:12
俺もそう思う。
どうせ特殊化で生成するなら、オーバーロードでいいんじゃね?
864:デフォルトの名無しさん
10/03/14 02:07:19
>>858
boostはよく知らないんですが後でちょっと探ってきます
>>589
これは面白いですね
コード生成は避けられんませんが、ちょっとシンプルになりました
>>860
待ちきれません
>>862,863
array<3> a(10, 15, 20);
a(1, 5, 3) = 100;
こんな感じで使おうと思ってるんで、num_of_argsは欲しいです
865:デフォルトの名無しさん
10/03/14 02:10:31
俺も要らないと思うわ
866:デフォルトの名無しさん
10/03/14 02:13:28
なぜ[a,b,c]という演算子がないのかっていう有意義な疑問に帰着するわけね。
867:デフォルトの名無しさん
10/03/14 02:14:53
>>866
x[Index(a, b, c)] で代用できるから
868:デフォルトの名無しさん
10/03/14 02:27:47
1次元の配列が作れる。n次元の配列に[a]演算子を適用するとn+1次元の配列が作れるならば、数学的帰納法で無限の次元の配列が作れることが証明できる。
早い話がvector<vector<vector<int>>>だね。
869:デフォルトの名無しさん
10/03/14 02:39:36
>>860
g++ 4.4ではもう使える。
870:デフォルトの名無しさん
10/03/14 02:40:37
ここ数日の質問って何をしたいのか見えてこないのが多いな
871:デフォルトの名無しさん
10/03/14 03:10:09
c++の文法書ってありますか?
書店に行ってもプログラミングの入門書ばかりで
言語仕様の解説書が見つからなくて困ってる
組み込みやる事になってgcc、GNUARM使う事になったんだが
文法がまるで分からん(K&R〜ANSIの頃のCは随分使ったんだが)
872:デフォルトの名無しさん
10/03/14 03:11:27
仕様書読めばいいじゃない
873:デフォルトの名無しさん
10/03/14 03:13:49
>>871
JIS規格ならJISのサイトや取り扱ってる書店で発注すれば購入できたり無料で見たりできるお!!!!!!
874:デフォルトの名無しさん
10/03/14 03:16:24
>>871 URLリンク(ja.lmgtfy.com)
875:デフォルトの名無しさん
10/03/14 03:19:23
文法がまるでわからないのなら
むしろ入門書のほうがいいんじゃないのかw
ってか組み込みならそんなに難しい文法の知識いらないし、
むしろ環境構築の方が面倒な気がするけどね
876:デフォルトの名無しさん
10/03/14 03:22:54
>>871
単にCの延長でいいなら入門書読めば事足りるはず。
C++らしいコードが書きたいなら
Effective C++とかMore Effective C++でも読んどけば?という感じ。
厳密な文法が知りたければISO/IEC 14882:2003が言語仕様書ということになってるが、
これを読んで特定の目的を達成するコードが書けるとは思えんなあ。
877:デフォルトの名無しさん
10/03/14 03:26:22
まぁ気持ちは分かる
入門書だとオペレーターオーバーロードとかnamespaceとかそんなん吹き飛ばして
いきなりstd::coutとか使い出すし
878:デフォルトの名無しさん
10/03/14 03:30:29
>>877
しかも、その場合、ADLまで絡んでくるしな。
879:デフォルトの名無しさん
10/03/14 03:34:03
俺も昔厳密な仕様が知りたいけど
仕様書とかダルイっていう舐めた態度の時にこの本買った
URLリンク(www.hir-net.com)
>>877
な感じで詰まってるなら入門書と並行してこういう本買ってもいいかもね
最近は色々種類あるだろうし翻訳物もあるだろうから本屋行って選ぶよろし
880:デフォルトの名無しさん
10/03/14 04:04:01
組み込みなら組み込みのスレで尋ねた方がいいと思うぜ
C++の一般論が必ずしも当てはまるとは限らんから
881:デフォルトの名無しさん
10/03/14 12:59:49
>>871
組み込みなら C 使えよ。
お前みたいなのが C++ 使うとバグが増える。
とりあえずヘッダ自動生成とかのツール類で
勉強してからにしろ。
882:デフォルトの名無しさん
10/03/14 13:03:01
デストラクタもないCにいわれてもな
883:デフォルトの名無しさん
10/03/14 13:06:49
>>881
> とりあえずヘッダ自動生成とかのツール類で
> 勉強してからにしろ。
何を言っているんだw
884:デフォルトの名無しさん
10/03/14 13:13:53
というか、強い静的型付けもないCなんかで書いたら、誰でもバグが増えるわ。
885:デフォルトの名無しさん
10/03/14 13:58:08
>>882-884
組み込みは製品になるとスタックダンプとレジスタぐらいしか
なくてアセンブラだけで解析すんの大変なんだぜ。
お前らみたいな糞コードのバグ解析がこっちに
回ってきて迷惑なんだよ。
886:デフォルトの名無しさん
10/03/14 14:04:43
そういうクソを調教するためにMISRA-Cとかがあります
887:デフォルトの名無しさん
10/03/14 14:29:06
>>885
組み込みつったって規模があるだろう
それこそメモリが数kbしかないものもあれば、OSが載っているようなシステムだってある
少し極論じゃないのか
888:デフォルトの名無しさん
10/03/14 14:40:51
Cでバグが減る根拠を挙げてもらおうか
889:デフォルトの名無しさん
10/03/14 14:46:53
誰もそんな事言ってないから
890:デフォルトの名無しさん
10/03/14 18:41:27
template<typename T>
void foo(const T& arg){
if(T::hoge_flag){
func_true(arg);
}
else{
func_false(arg);
}
return;
}
この様なコードがありまして、T::hoge_flagは
T型によりコンパイル時に決定されるconst bool型の定数とします。
すなわち T::hoge_flag の真偽によって
func_true(arg);とfunc_false(arg);の一方だけが必ず実行され
他方は必ず実行されないことになります。
こういった場合は、テンプレートメタプログラミングを使って
一方だけのコードが実行バイナリファイルに含まれるようにすべきなのでしょうか。
それともコンパイラの最適化を期待して上記のコードのままでも良いのでしょうか。
よろしくお願い申し上げます。
891:デフォルトの名無しさん
10/03/14 19:09:38
コンパイラの機嫌しだい
892:デフォルトの名無しさん
10/03/14 19:10:12
>>890
最適化に期待すれば十分だと思うよ。
実測してその部分がパフォーマンスに影響することが分かってから改良しても遅くないよ。
893:デフォルトの名無しさん
10/03/14 19:20:20
そういう場合テンプレートメタプログラミングを理解できないコンパイラだったら
困る・・・か?そんなバカコンパイラは想定しない方が良いか。
894:デフォルトの名無しさん
10/03/14 19:20:28
struct when_true{ inline static void func(arg_t); }; struct when_false { (ry };
if_<flag, when_true, when_false>::type::func(arg);
確実性を考えると↑のように関数化しないといけない
結局のところオーバーヘッドは避けられないからif elseのままでいいよ
895:デフォルトの名無しさん
10/03/14 19:25:09
たとえば、
template<bool N>
void func();
でN値による特殊化なんかできるのかな
896:デフォルトの名無しさん
10/03/14 19:32:55
こんなので切り替えれられるとおも浮けど、わざわざ属性を示すクラスが下からあればいいけど、わざわざ作るなら、ifのほうが分りやすいかもな。
class TypeA{};
class TypeB{};
class hoge :public TypeA
{
};
class fuga :public TypeB
{
};
template<class T>
void func(const T& obj,typename boost::enable_if<boost::is_convertible<T*,TypeA*>>:type* =0)
{
}
template<class T>
void func(const T& obj,typename boost::enable_if<boost::is_convertible<T*,TypeB*>>:type* =0)
{
}
void test()
{
hoge h;
fuga f;
func(h);
func(f);
}
897:デフォルトの名無しさん
10/03/14 20:07:40
if文の削除なんてあまりにも可読性が低くなってる場合しかオレはやらないな
速度やコードサイズの最適化なんてたかがしれてるだろ
>>896
わざわざややこしくしてないか?
それだったらenable_if_cにして直接T::hoge_flagを突っ込めばいいんじゃん
typename boost::enable_if_c<T::hoge_flag>:typeと
typename boost::disable_if_c<T::hoge_flag>:typeだけで
他にクラスや関数を用意する必要はないはず
まあこんなことしなきゃならないほどカツカツなら
他に検討すべき箇所があるんじゃないのかね
898:デフォルトの名無しさん
10/03/14 20:08:46
>>895
できるっしょ。
template<bool b>
void func(){〜};
template<>
void func<true>(〜);
これでおkでは?
899:デフォルトの名無しさん
10/03/14 20:44:03
もう面倒だからboolじゃなくて関数ポインタででも持たせとけよ。
900:デフォルトの名無しさん
10/03/14 20:50:27
関数ポインタは最適化の障害で(ry
901:デフォルトの名無しさん
10/03/14 20:55:24
コストとコードサイズ小さくしたいのにカンポはねーよ・・・
902:デフォルトの名無しさん
10/03/14 20:57:24
結局ifelse書いて最適化に期待するのに落ち着きそうだな
関数化するまでも無い分岐の場合は特にそうだろう
903:デフォルトの名無しさん
10/03/14 20:59:40
この状況で関数ポインタ持たせたら
逆効果じゃねぇかwwwww
904:デフォルトの名無しさん
10/03/14 21:00:55
コンパイル時に定まるif elseで絶対に実行されないことが
分かる場合、それでも最適化できないバカコンパイラって
知っている?
それを最適化できないとなるともっと重大な所でも
最適化できなさそうな気がするが。
905:デフォルトの名無しさん
10/03/14 21:19:48
URLリンク(codepad.org)
なんでこれが期待どおりに動いてるのかよく分からない
906:デフォルトの名無しさん
10/03/14 21:47:54
Conceptさん・・・Conceptさんを呼べ!!
907:デフォルトの名無しさん
10/03/14 21:51:07
templateの部分特殊化とSFINAE。
メンバT::swapが存在し、かつvoid (T::*)(T &)が&T::swapに置き換え可能ならば
(その場合のみ)has_swap_implの部分特殊化が選択される。
908:デフォルトの名無しさん
10/03/14 21:55:48
カードゲームの効果解説かと思った。
909:デフォルトの名無しさん
10/03/14 22:40:36
>>888
>>871 は C はそれなりに書けるようだが、
解説書見ながら C++ で書いてより高品質なソフトが
書ける理由がないだろ。
どうせ new[] したのを delete するようなコード
書いて地雷仕込むのがオチ。
910:デフォルトの名無しさん
10/03/14 23:18:09
>>905
まず、has_swap<T>はどんな型にも適合するのでhas_swap<hoge>の実体化が行われる。
コンパイラはhas_swap<hoge>の基底クラスとして、has_swap_impl<hoge, void>を実体化しようとする。
なお、has_swap_implの第2テンプレート引数は省略されているのでデフォルトのvoidが使われる。
has_swap_impl<hoge, void>を実体化しようとした際に、
コンパイラはまず、より特殊化されたバージョンである
14行目のバージョンに適合するかのチェックを行う。
ここで問題は、typename has_swap_helper<T, &T::swap>::type が void と一致するかどうか。
・メンバ関数としてvoid T::swap(T&)が存在するならば、has_swap_helperのテンプレート引数が確定し、
かつ4行目のテンプレートに適合するので、4行目のテンプレートが実体化され、voidになる。
すると、has_swap_impl<hoge, void>は14行目のバージョンに適合する。
・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。
通常の感覚ならばエラーになりそうだが、 SFINAEの規則によってエラーとはならず、
単に14行目のバージョンが候補から除外される。
コンパイラは次に9行目のバージョンの実体化を行おうとする。
9行目は何でも適合するので、has_swap_impl<fuga, void>は9行目のバージョンに適合する。
あくまでもhas_swap_impl<hoge, void>がどれにマッチするかが問題なので、
たとえば6行目のtypedefをintに変えたりするとダメ
(その場合、9行目を class U = int にすればいい)
911:デフォルトの名無しさん
10/03/14 23:20:30
っていうオーバーロード解決に至るまでの経過を出力してくれるコンパイラないかなぁ
特殊化とかADLとか絡んでついていけない時がままある
912:デフォルトの名無しさん
10/03/14 23:25:19
言い出しっぺの法則発動
913:デフォルトの名無しさん
10/03/14 23:33:42
あ、>>910間違えてた。
誤) ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。
正) ・void T::swap(T&)が存在しないならば、has_swap_helperのテンプレート引数が確定しない。
914:デフォルトの名無しさん
10/03/14 23:34:08
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct TestData {
int id; char *name; char *sp; char *sx;
int nr_param; char *param;
} TestData;
#define PARA(max,at,sp) ":" #max "," #at "," #sp
static TestData test_array[] = {
{ 1, "NA", "SpA", "M", 3, PARA(0, 0, 1) PARA(2, 3, 4) PARA(5, 6, 7), },
{ 2, "NB", "SpB", "???", 1, PARA(1, 2, 3), },
};
void dump_testdata(TestData *t) {
int i;
const char *p;
printf(" Id:%d, Name:%s, Sp:%s, Sx:%s\n", t->id, t->name, t->sp, t->sx);
p = t->param;
for ( i = 0; i < t->nr_param ;i++) {
int m, a, s;
m = atoi(p = strchr(p, ':')+1);
a = atoi(p = strchr(p, ',')+1);
s = atoi(p = strchr(p, ',')+1);
printf(" param: max:%d, attack:%d, speed:%d\n", m, a, s);
}
}
int main(void) {
dump_testdata(&test_array[0]);
dump_testdata(&test_array[1]);
return 0;
}
915:デフォルトの名無しさん
10/03/14 23:35:40
アンカー消えた。
>>914 は >>852
これくらいしか思いつかん。
916:デフォルトの名無しさん
10/03/14 23:57:05
>>907,910
どうもありがとう、なんとなくわかってきた
なるべく特殊化が強いのを優先的にリストアップして最初に合致したやつを使うということですね
917:デフォルトの名無しさん
10/03/15 00:03:50
C++使ってちょうど2年半の者です。
テンプレートメタプログラミングって
とても難解そうで ほとんど学んでいないのですが、
例えば>>890さんの場合ですとどうすればいいことになるのでしょうか。
どなたかコードを(boost::mplのような出来合いのライブラリを
使用せずに)書いてくださいませんでしょうか。
よろしくお願いします。
918:デフォルトの名無しさん
10/03/15 00:19:42
>>917
最近、C++を勉強し始めたからテンプレートを勉強していないんだけど
こんな難しそうなのを「みんな出きるのか〜」とビビってたぜ
あぁ〜安心した
919:デフォルトの名無しさん
10/03/15 00:24:32
メタプロはライブラリ作者のためのものと言い切っても過言ではない
知ってても使う場面は実はそれほど多くない(なくても実装できることが多い)し
使える場面だとしてもすでにできの良いライブラリがあるからそっちを使うことになる
920:デフォルトの名無しさん
10/03/15 00:24:39
これは静的(コンパイル時)なのか動的(実行時)なのか
とかを意識すると多少理解が楽になる
921:デフォルトの名無しさん
10/03/15 00:35:15
>>917
boost::mplを使えるようになれば自然と覚えられるよ。
922:デフォルトの名無しさん
10/03/15 01:13:45
こういうこと言うと否定されるのかもしれないけど
TMPって出来合いのライブラリを使うプログラミングだと思う
自分でメタ関数やシーケンスをフル実装してる奴とかいるのかね
そういやTMPの本が出版されたんだっけ?
923:デフォルトの名無しさん
10/03/15 01:19:46
templateでメタプログラミングするのが嫌なら別の方法でメタプログラミングすればいいよ。
template使ってる人は型レベルとの相性が良い(というか型レベルそのものだ)から好きで使ってるだけ。
924:デフォルトの名無しさん
10/03/15 05:19:50
>>917
自信ないけどこんなんでどうか
URLリンク(codepad.org)
ところで、こういうのって、boolでやるのと
struct true_tag {};
struct false_tag {};
とかを定義してやるのと、どっちがいいんだろ?
925:デフォルトの名無しさん
10/03/15 06:57:33
>>917
これでいいっしょ。
template<typename T, bool b>
void foo_impl(const T &arg) { func_true(arg); }
template<typename T>
void foo_impl<T, false>(const T &arg) { func_false(arg); }
template<typename T>
void foo(const T& arg) { foo_impl<T, T::hoge_flag>(arg); }
まあTMPなんて必要性が感じられなければ無理に使うような物でもないと思うよ。
付け焼刃の知識では早々使えるコードが出てくることもない。
何に使えるのかわかってからでも使い始めるのは遅くない。
まずは既存のコードでどう使われているのか観察することだな。
926:917
10/03/15 10:53:59
みなさんありがとうございます。
C++0xではテンプレートメタプログラミングをサポートするためだけにあるような
機能が増えると伺っておりましたので、そろそろ勉強し始めるときが
来たような気がしています。
927:デフォルトの名無しさん
10/03/15 12:28:21
>>922
そうだとおもう。テンプレートは作るのは地獄だけど、使うのは楽になるように作るように心がけてる。
関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに正しいコードが出るんだから、丁寧に作った関数テンプレートは使う側にとって大きなメリットがあると思う。
928:デフォルトの名無しさん
10/03/15 13:17:19
>>927
お前はテンプレートメタプログラミングってなんだか理解しているのか?
> 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに
> 正しいコードが出るんだから、丁寧に作った関数テンプレートは
> 使う側にとって大きなメリットがあると思う。
>>922もみんなもテンプレートメタプログラミングの話をしているんだけど。。。
929:928
10/03/15 13:18:35
ああ、分かった。
>>927はTMPがTeMPlateの略だと思ってた訳か。
これで文脈が繋がった。
930:デフォルトの名無しさん
10/03/15 15:19:03
ネットの画像のURLから隠しフォルダ「Temporary Internet Files\Content.IE5」以下に検索をかけてファイルを見つけようとしています。
ファイルは見つかるんですが、URLリンク(a.com)からだとファイル名はaa[1].jpgになっています。
URLリンク(zzzzzz.com) とではファイル名の区別がつきません。Temporary Internet Filesのファイルをプロパディで
見るとURLの情報が解るのですが、この情報を参照できるような関数や方法ってありませんか?
931:デフォルトの名無しさん
10/03/15 17:08:24
環境依存OKなスレで聞きなよ
932:930
10/03/15 17:21:02
>>931
もしかして自分だけですかね?Temporary Internet Filesの特性かと思っていました。
933:デフォルトの名無しさん
10/03/15 17:31:05
それで?C++という言語の何を訊きたいの?
934:デフォルトの名無しさん
10/03/15 17:35:21
return static_cast<931::環境依存>(930の悩み); //invalid static_cast form type "932.オレだけ?" to type "世界平和"
935:930
10/03/15 17:52:06
C++で作って詰まって短絡的に聞いてしまいました、すみません。
D:\Temporary Internet Files\Content.IE5を見たところindex.datがあるので、ここでファイルとアドレスを関連付けて
\Temporary Internet Filesに表示させてる? datをC++で読み込んで目当てのファイルを見つけることは可能でしょうか?
936:デフォルトの名無しさん
10/03/15 18:01:30
_,,_
/´o ヽ
,.ィゝ l
 ̄ヽ l
l ヽ___
/ ,,...---`ニニニ==、,,__
l / ヽ ヽ ヽ ヽ ヽ ヽ ヽ l三三三>
| iヽ ヽ ヽ ヽ ヽ ヽ ヽ/三三/''ー- 、
ヽ. ヽ、ヽ ヽ ヽ ヽ ヽ.∠三=‐''´>‐--‐'
ヽ、`'''ー‐---‐'''´_,,...--‐'''´
`''ーッ--t_,r'''´
_/._/
937:デフォルトの名無しさん
10/03/15 18:33:35
>>935
そうでなくて、Windowsという環境依存なプログラムについては「環境依存OKなスレで聞きなよ」ってことでしょ
938:デフォルトの名無しさん
10/03/15 18:56:25
>>930
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
スレリンク(tech板)l50
939:930
10/03/15 19:00:08
スレチですね。見当違いですみません…
940:デフォルトの名無しさん
10/03/15 20:13:17
>>925
二つ目のfoo_impl()はコンパイルエラー起こすだろ
関数テンプレートで部分的特殊化は無理
941:デフォルトの名無しさん
10/03/15 21:25:05
STLのvecterの配列に対してクイックソートを組んだんですが動きません
ソース : URLリンク(codepad.org)
47、48行目の再帰処理のあたりが原因だと思うのですが、誰か助けてください
942:デフォルトの名無しさん
10/03/15 21:55:20
勘だけど 43、44行目あたりかな
943:デフォルトの名無しさん
10/03/15 22:01:47
見た感じだと44行目か36行目のどっちかだな
944:デフォルトの名無しさん
10/03/15 22:10:03
見てないけど44行目かな
945:デフォルトの名無しさん
10/03/15 22:14:34
どうみても44が--
946:デフォルトの名無しさん
10/03/15 22:45:42
>>944
> 見てないけど
おいw
947:デフォルトの名無しさん
10/03/15 23:16:01
>>871です
>>876
ありがとうございます、一番参考になりました
近日中に都会に出かけるのでwあったら立ち読み&購入検討してきます
何度かパーサを書く仕事をしたので、どうしてもライブラリより構文に目が行ってしまいます
最近はそういうの流行らないみたいですね
もはやIBM流の構文チャート?やBNFで定義できるような言語じゃないとは
噂で聞いてはおりますが…
948:デフォルトの名無しさん
10/03/16 00:23:47
>>941
添え字10のアクセス違反って出てるじゃん
m_array[9]に値入れた後にjをインクリメントしてるんだろ
>>947は組み込み自体やった事なさそうな感じ
949:デフォルトの名無しさん
10/03/16 02:36:50
class hoge
{
const fuga &f;
public:
hoge() : f(fuga_sub())
{
}
};
const参照はテンポラリオブジェクトを束縛すると聞いたんですが、↑のようにするとバグります。なぜなんでしょうか?
950:デフォルトの名無しさん
10/03/16 02:37:50
fはhogeのコンストラクタスコープでしか生きてないインスタンスをさしてるから
951:デフォルトの名無しさん
10/03/16 05:58:00
>>948
ええ、組み込みは初めてです
使ってもいいライブラリはサンプル等あるんで問題ないんですが
コンストラクタの初期化リストなんて初めて見ました
トッパンのC++の本なら昔買いましたが、今更役に立ちませんよねw
952:デフォルトの名無しさん
10/03/16 07:58:42
>>949
初期化リストで使った場合、コンストラクタの終わりまでしか延命されない。
規格の 12.2 p5 より。
> ... A temporary bound to a reference member in a constructor's ctor-initializer
> persists until the constructor exits. ...
その特別ルールが役に立つのはほぼ自動変数だけ。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5400日前に更新/218 KB
担当:undef