[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 20:36 / Filesize : 218 KB / Number-of Response : 953
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part78



1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part77
pc12.2ch.net/test/read.cgi/tech/1263556932/

809 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:30:01 ]
null_ptrをお待ちください

810 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 17:15:12 ]
>>807
実装上の都合を言語ユーザに押し付けてる感はあるな

811 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:14:16 ]
>>810


812 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:16:22 ]
ごめん、途中で送信してしまった。

>>810
他の言語はともかく、
余計なオーバーヘッドを嫌うC++なら、こういう制限も許される(むしろ歓迎される?)よね。

813 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:38:24 ]
>>810
型変換については妥当な話だと思うし、 nil の不在は実装上の都合ではないだろうし、
何のことを言ってるの?

814 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:11:09 ]
void Test(int *array) {
// ごにょごにょ(配列の長さについては考えないとする)
}

みたいな関数があったとき、
int array[3] = {0,0,0};
Test(array);
はコンパイルできるのに、
Test({0,0,0});
はコンパイルできない。
配列に付ける名前が不足しちゃうのでなんとか名前を付けずにやりたいんだけど、
良い手段ない?
それともなんでもいいからとりあえず名前を付けざるを得ないんだろうか。

815 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:18:13 ]
名前付けないと可読性下がりそう

816 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:22 ]
可変長引数マクロ関数使えるのか



818 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:59 ]
配列リテラルとかLL出身者っぽい要望だなぁ

820 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:50 ]
>>820
なんかTestの引数が全部array1になっちゃってますが、
2回目はarray2、3回目はarray3です・・・。

822 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:36:44 ]
C99にはズバリの機能(複合リテラル)があるのだが、C++0xに入るとは聞いていない。
Test((int[]){0,0,0});

823 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:40:22 ]
>>822
std::initializer_listが入る

825 名前:814 mailto:sage [2010/03/13(土) 21:41:00 ]
>>823
>>820でちょこっと書きましたが、実際には配列のデータはもっとぐしゃぐしゃで、
必ずしも
arys[i][0]=0;
arys[i][1]=0;
arys[i][2]=i;
となるわけではないのです。
質問のために簡略化しているので・・・すみません。

826 名前:デフォルトの名無しさん mailto:sage [2010/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 mailto:sage [2010/03/13(土) 21:50:09 ]
>>826
そうした方がいいでしょうかね・・・大量のデータをソースコードにべた書きするのは
よくないかなぁと思ったんですが、
データをあまり見られたくないんですよ。
それで、別ファイルにするよりはソースコードに埋め込んだほうがどちらかというと
見られにくいかなぁと思ったので。
別にソースに埋め込んでも見ようとすれば見れるのでなんてことはないんですが。



828 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:54:44 ]
慣れたLLでコードジェネレートしればいいじゃない

829 名前:814 mailto:sage [2010/03/13(土) 21:57:51 ]
>>828
なるほど、考えてみます。ありがとうございます。

830 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:58:14 ]
>>827
__VA_ARGS__ は使えんのか? >>816 にあるやつ。

831 名前:814 mailto:sage [2010/03/13(土) 22:02:11 ]
>>830
Visual C++ 2008なので使えると思います。
考えてみます。

832 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:04:48 ]
>>820
int *arrays[] = {
{ 0,0,0 },
{ 0,0,1 },
{ 0,0,2 }
};

みたいなのじゃダメなの?
argv と同じやりかた。


833 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:07:18 ]
>>832 コンパイルしてみてから言おうな。

834 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:14:19 ]
めんどくせw


835 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:19:38 ]
>>816
__LINE__とくっつけたとして、どうやって参照するの?同じ行が前提?

836 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:50:27 ]
>>835
同じ行に書くか、ひとつのマクロ内であれば問題なく使えるでしょ。

この場合は単にスコープ分けるだけでも済みそうだし、
__VA_ARGS__ が使えるなら >816 のやつがいいと思う。

837 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:08:15 ]
>>837
int の配列って言ってるだろ。十分なデータ構造じゃないか。
規則性がなくてぐしゃぐしゃなのは配列の中の値だろ。

839 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:20:29 ]
(データ長+データ実体)*nを1次元配列で持つとか

840 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:24:19 ]
質問のために簡略化してるって構造のことじゃなくて値のことだったのか?
だったら二次元配列を使おう、でおしまいだね。いったい何を悩んでるんだろう

841 名前:814 mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:07:58 ]
実際にどう記述してるのか分からん

843 名前:814 mailto:sage [2010/03/14(日) 00:09:58 ]
一応締切?とさせていただきます。
レスを頂いた皆さま、大変参考になりました。ありがとうございました。

844 名前:デフォルトの名無しさん mailto:sage [2010/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 mailto:sage [2010/03/14(日) 00:24:12 ]
>>844
メンバ変数のうち、Id、Name、Hp_max、Attack、Speedは親クラスから継承しているメンバなのです。
親クラスが存在するクラスではそういう書き方はできなかったかと・・・

846 名前:844 mailto:sage [2010/03/14(日) 00:28:37 ]
>>845
初期化用データの格納用に >>844 の X のような構造体を定義すれば
初期化データをすっきり記述できるんじゃないかってこと

847 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:28:58 ]
データ部分は関係ないだろ



848 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:30:13 ]
>>827
どれくらい見られたくないのかにもよるけど、別ファイルにしてスクランブルかけた方が見られにくいよ

849 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:39 ]
>>841
ひでぇ。最初っからそう聞けよ。 >814 みたいにしたせいで無駄なレスがあんなに。

850 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:49 ]
コンストラクタを一つ増やせってことじゃない?

851 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:37:51 ]
>>845
CTest::CTest(const X &init) : m_id(init.id), ・・・
{
}

852 名前:814 mailto:sage [2010/03/14(日) 00:38:12 ]
>>849
すみません。私の聞き方が悪かったせいで、これ以上続けても私が質問したいことを上手く書けるか分かりませんので、
これで終わりにさせてください。
乱暴なようで申し訳ないのですが、以後レスは致しません。

853 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:38:22 ]
warota

854 名前:デフォルトの名無しさん [2010/03/14(日) 00:39:42 ]
                 ┌─┐
                 |も.|
                 |う |
                 │来│
                 │ね│
                 │え .|
                 │よ .|
      バカ    ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎

855 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:41:22 ]
gccのC99拡張機能を有り難がって使ってんじゃねーぞ
聞く方が混乱するだけだ

856 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:42:56 ]
えっ

857 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:15:29 ]
template <int num_of_args> class hoge
{
void operator () (int a1, int a2, ...);
};

num_of_argsに対応してoperator ()の引数の数を変動させたいのですが、特殊化をジェネレートするほかにいい方法は無いですかね?



858 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:22:48 ]
>>857
「ジェネレート」がコンパイル以外のプロセスを指しているのなら、 Boost.Preprocessor が
いくらかマシな手段となるかもしれない。

859 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:26:06 ]
>>857
C++0xを、首を長くして待て。

861 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:28:23 ]
きりんさんになっちゃいそうです><

862 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:38:21 ]
>>857
num_of_argsが要らなくない?無いほうがすっきりしないか?

863 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:55:12 ]
俺もそう思う。
どうせ特殊化で生成するなら、オーバーロードでいいんじゃね?

864 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:10:31 ]
俺も要らないと思うわ

866 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:13:28 ]
なぜ[a,b,c]という演算子がないのかっていう有意義な疑問に帰着するわけね。


867 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:14:53 ]
>>866
x[Index(a, b, c)] で代用できるから



868 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:27:47 ]
1次元の配列が作れる。n次元の配列に[a]演算子を適用するとn+1次元の配列が作れるならば、数学的帰納法で無限の次元の配列が作れることが証明できる。
早い話がvector<vector<vector<int>>>だね。

869 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:39:36 ]
>>860
g++ 4.4ではもう使える。

870 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:40:37 ]
ここ数日の質問って何をしたいのか見えてこないのが多いな

871 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:10:09 ]
c++の文法書ってありますか?
書店に行ってもプログラミングの入門書ばかりで
言語仕様の解説書が見つからなくて困ってる

組み込みやる事になってgcc、GNUARM使う事になったんだが
文法がまるで分からん(K&R〜ANSIの頃のCは随分使ったんだが)

872 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:11:27 ]
仕様書読めばいいじゃない

873 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:13:49 ]
>>871
JIS規格ならJISのサイトや取り扱ってる書店で発注すれば購入できたり無料で見たりできるお!!!!!!

874 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:16:24 ]
>>871 ja.lmgtfy.com/?q=C%2B%2B

875 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:19:23 ]
文法がまるでわからないのなら
むしろ入門書のほうがいいんじゃないのかw
ってか組み込みならそんなに難しい文法の知識いらないし、
むしろ環境構築の方が面倒な気がするけどね

876 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:22:54 ]
>>871
単にCの延長でいいなら入門書読めば事足りるはず。
C++らしいコードが書きたいなら
Effective C++とかMore Effective C++でも読んどけば?という感じ。
厳密な文法が知りたければISO/IEC 14882:2003が言語仕様書ということになってるが、
これを読んで特定の目的を達成するコードが書けるとは思えんなあ。

877 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:26:22 ]
まぁ気持ちは分かる
入門書だとオペレーターオーバーロードとかnamespaceとかそんなん吹き飛ばして
いきなりstd::coutとか使い出すし



878 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:30:29 ]
>>877
しかも、その場合、ADLまで絡んでくるしな。

879 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:34:03 ]
俺も昔厳密な仕様が知りたいけど
仕様書とかダルイっていう舐めた態度の時にこの本買った
www.hir-net.com/book/book14/index.html
>>877
な感じで詰まってるなら入門書と並行してこういう本買ってもいいかもね
最近は色々種類あるだろうし翻訳物もあるだろうから本屋行って選ぶよろし

880 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 04:04:01 ]
組み込みなら組み込みのスレで尋ねた方がいいと思うぜ
C++の一般論が必ずしも当てはまるとは限らんから

881 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 12:59:49 ]
>>871
組み込みなら C 使えよ。
お前みたいなのが C++ 使うとバグが増える。

とりあえずヘッダ自動生成とかのツール類で
勉強してからにしろ。


882 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:03:01 ]
デストラクタもないCにいわれてもな


883 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:06:49 ]
>>881
> とりあえずヘッダ自動生成とかのツール類で
> 勉強してからにしろ。
何を言っているんだw

884 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:13:53 ]
というか、強い静的型付けもないCなんかで書いたら、誰でもバグが増えるわ。

885 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:58:08 ]
>>882-884
組み込みは製品になるとスタックダンプとレジスタぐらいしか
なくてアセンブラだけで解析すんの大変なんだぜ。

お前らみたいな糞コードのバグ解析がこっちに
回ってきて迷惑なんだよ。


886 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:04:43 ]
そういうクソを調教するためにMISRA-Cとかがあります

887 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:29:06 ]
>>885
組み込みつったって規模があるだろう
それこそメモリが数kbしかないものもあれば、OSが載っているようなシステムだってある
少し極論じゃないのか



888 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:40:51 ]
Cでバグが減る根拠を挙げてもらおうか

889 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:46:53 ]
誰もそんな事言ってないから

890 名前:デフォルトの名無しさん [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:09:38 ]
コンパイラの機嫌しだい

892 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:10:12 ]
>>890
最適化に期待すれば十分だと思うよ。
実測してその部分がパフォーマンスに影響することが分かってから改良しても遅くないよ。

893 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:20:20 ]
そういう場合テンプレートメタプログラミングを理解できないコンパイラだったら
困る・・・か?そんなバカコンパイラは想定しない方が良いか。



894 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:25:09 ]
たとえば、
template<bool N>
void func();
でN値による特殊化なんかできるのかな

896 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:08:46 ]
>>895
できるっしょ。
 template<bool b>
 void func(){〜};
 template<>
 void func<true>(〜);

これでおkでは?


899 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:44:03 ]
もう面倒だからboolじゃなくて関数ポインタででも持たせとけよ。

900 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:50:27 ]
関数ポインタは最適化の障害で(ry


901 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:55:24 ]
コストとコードサイズ小さくしたいのにカンポはねーよ・・・

902 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:57:24 ]
結局ifelse書いて最適化に期待するのに落ち着きそうだな
関数化するまでも無い分岐の場合は特にそうだろう

903 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:59:40 ]
この状況で関数ポインタ持たせたら
逆効果じゃねぇかwwwww


904 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:00:55 ]
コンパイル時に定まるif elseで絶対に実行されないことが
分かる場合、それでも最適化できないバカコンパイラって
知っている?

それを最適化できないとなるともっと重大な所でも
最適化できなさそうな気がするが。


905 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:19:48 ]
codepad.org/3HNtsPNZ
なんでこれが期待どおりに動いてるのかよく分からない

906 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:47:54 ]
Conceptさん・・・Conceptさんを呼べ!!


907 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:51:07 ]
templateの部分特殊化とSFINAE。
メンバT::swapが存在し、かつvoid (T::*)(T &)が&T::swapに置き換え可能ならば
(その場合のみ)has_swap_implの部分特殊化が選択される。



908 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:55:48 ]
カードゲームの効果解説かと思った。

909 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 22:40:36 ]
>>888
>>871 は C はそれなりに書けるようだが、
解説書見ながら C++ で書いてより高品質なソフトが
書ける理由がないだろ。

どうせ new[] したのを delete するようなコード
書いて地雷仕込むのがオチ。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<218KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef