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


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

【初心者歓迎】C/C++室 Ver.69【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 16:10:55 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.68【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1253193779/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か   に置換すると見栄えだけはよくなります。

152 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:34:48 ]
>>148
バトルしてるつもりなの?w

153 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:35:32 ]
>>152
別に。
しかも実際に懸念通りの展開になってしまったようで。

154 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:37:18 ]
>>150
exitは基本的に正常終了のときに使うんだが。

ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/exit.3.html

> exit() 関数は、プロセスを正常に終了させ、 status & 0377 という値を親プロセスへ返す (wait(2) を参照)。

155 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:38:36 ]
>>153
揚げ足かどうかは認識の違いだな。元々ネタなんだし。

156 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:38:40 ]
>>154
正常系≠正常終了

157 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:39:32 ]
>>156
正常系でもプログラムをさっさと終わらせたいことだってある。

158 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:40:09 ]
>>157
それならば例外を使っても問題は無い

159 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:41:00 ]
正常系じゃなきゃ例外使っちゃいけないという前提がおかしい。
変に乱用しなきゃいいだけ。

160 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:41:41 ]
間違えた。正常系では例外を、だ。



161 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:41:48 ]
>>158
自分もそう思うが、前スレで強く否定する人や正常系で例外を使うべきでないという
正論を言う人がいたりして、今は揺れているというのが実状。

162 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:46:30 ]
>>161
atexitを駆使してまで例外での脱出を避けるのは、goto絶対禁止とかそういう部類を
思い出すが。まぁ例外はコストがわずかに掛かるが。
とは言っても、例外を完全に排除して例外非対応コンパイルでもしない限り、例外
をthrowかcatchしなきゃ(例外仕様は当然書かない)効率は変わらない訳で、実際
のところはやっぱり宗教論争としか。

163 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:52:49 ]
>>162
いい加減何度も書くのもアレなんだが、元々ネタなんだよ。自分が担当者だったら、
C++でatexitなんて絶対使わない。(Cならデストラクタがない分、使えば便利なときも
あるかもしれない)

自分は元々さっさと終わりたいときは正常系で例外投げていたクチなんで、例外時に
予期しない重い処理が走る可能性があるとか、正常系で例外は投げるべきでないとか
言われると、ちょっとな。正論は強い。

自分が書いたコードで、「例外使っていて便利でしょ?」とか見せたとき、そんなことを
言われると、返す言葉もない。

164 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:53:51 ]
そしてスルーされてる質問が

165 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:55:01 ]
>>163
最初はともかく、いつの間にかネタじゃなくなってるようにしか見えない奴がいる
って話だろ

166 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:56:41 ]
グローバル変数に設定されたスタックが有効なままexitされたかどうかの判断って面倒じゃない?
関数を抜けるときに必要分POPしたりすんの?

167 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:57:01 ]
どうせ破棄が気になる時にexitなんか呼ばないんだからどうでもいいじゃんよ・・・

168 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:59:43 ]
どうせやらないからどうでもいいんでそろそろやめろ

何もやらないで文句言う奴よりまし

どうせやらないことをだらだら無駄に実験垂れ流す奴よりまし

取っ組み合い

169 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:01:07 ]
>>167
元々atexitを使ってるプログラムのデバッグをさせられるなんて可能性は十分に
考えられるよ。規格、仕様なら隅々まで知っていて損はない。

170 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:02:41 ]
>>169
そういう範疇の話から逸脱してきてるじゃん>>86は明らかに



171 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:03:45 ]
>>170
そういうふうにしか捉えられなかったとしたらすまなかった。

172 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:09:17 ]
徹底的に粘る人なんだなぁ
こういう人は絶対に「お前の方が馬鹿だ」って態度を曲げないと思うけど、
まだ取っ組み合うの?

173 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:11:44 ]
そのタイプが二人揃うとこうなる訳ですよ

174 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:13:21 ]
>>172
馬鹿にはしてないよ。ちょっと深読みしすぎじゃないか。


175 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:15:48 ]
自分の文章がどう見えるかが分からないタイプでもあるようだ

176 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:17:07 ]
人格攻撃始まりました

177 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:17:32 ]
そんなの受け取りかた次第でしょ。被害妄想かもしれないし。

178 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:20:07 ]
まさに>>172

179 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 23:33:34 ]
◎◎◎
◎◎◎
◎◎◎

180 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 00:15:40 ]
windowsでもunixでも、確実にテンポラリファイル作る方法ありますか
DVDから起動したり、読み取りアクセスしかない場合はカレントディレクトリには出来ないのですが。



181 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 00:22:24 ]
>>180
tmpfile()
が使えるかも知れない

182 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 00:22:43 ]
>>180
環境変数で設定されているテンポラリフォルダに作る

183 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 00:39:16 ]
サンクス tmpfile調べてみます
環境変数は、どの環境でも同じやり方で、確実にとれるんですか。

184 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 00:42:02 ]
tmpfileはファイルのパスが特定できないみたいですね。
そのファイルをリネームしたりしたいんです。

185 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 00:52:06 ]
思いっきり環境依存の問題を環境に依存せず、とな
ファイルのリネームだって環境依存だろうに
ディレクトリデリミタの問題だってある
せめてgccとかビルド環境を限定しないと答えられんのでは

素直にその手の事を吸収するライブラリを使うか
個別に書いて切り分ける方がいいと思うけど

186 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 02:03:04 ]
>>183->>184
まさかこんなレスが来るとは予想できなかった
対象とするunixは何?

187 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 02:34:28 ]
codepad ttp://codepad.org/xmwNfoSh

Hogeクラスのデータメンバdataの型を
Hogeのコンストラクタの引数で決定したいと思っているのですが、
そうるすとdataの宣言の< >内が書けません。

どのようにすれば良いでしょうか?


188 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 03:08:22 ]
>>187
継承を使うべきところをテンプレートにしてるのが間違いに見える

Dataクラスは不要でHogeではD*を持つように
そしてHogeのコンストラクタでD0/D1をnewするのが普通のやり方かと思う
newの失敗とデストラクタに注意しないといけないとは思うが

class Hoge
{
private:
D* pdata;
public:
Hoge(int flag){
//以下は例外を投げる可能性があるので注意
if(flag==0){
pdata = new D0();
}else{
pdata = new D1;
}
(以下略)

189 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 04:25:32 ]
>>188
それだと Hoge() を2回呼び出しただけで死ねる。 auto_ptr ぐらい使おうぜ。

190 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 08:50:58 ]
Hogeはコンストラクタだし
質問にはそこまで含まれてないんだからいいんじゃね



191 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 14:12:31 ]
入力ファイルをプログラム引数として受け取るってどうゆう事ですか?

192 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 14:20:38 ]
>>191
FILEポインタを食う関数か、
ファイルネームを食って関数内で展開する関数か、
または実行ファイルの引数で指定するか。

193 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 15:54:06 ]
変数Aに1を代入
これをwhile(1)などでずっと繰り返しているとメモリがモリモリたまるのですが、
なぜでしょう?
どこかでログを取っているんでしょうか
またこれを防ぐ方法はありますか?

194 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 15:56:09 ]
そんなことはない
貼り付けてみろ

195 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 17:23:47 ]
>>194
すいません、なりませんでした。気のせいでした

196 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 20:26:42 ]
>>192
上二つもプログラム引数って言ったりするもんなの?

197 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 21:20:38 ]
プログラム引数なんて用語はない

198 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 22:25:27 ]
ガチスレかと思った。

199 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 02:12:09 ]
すみません。これらの文字列が
一つでも出現するか調べたいのですが速い方法ありますか。
調べる文字列がおおくなるほど、その個数分時間が増える方法しかわかりません。 = 一つ一つ調べる。

"HTML"
"html"
"?xml"
"?XML"
"<body"
"<BODY"

200 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 02:15:58 ]
>>199
正規表現(となるべく高速な正規表現エンジン)を使う。



201 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 02:24:09 ]
正規表現は多機能な分だけ遅い気がしてます。あと、orで繋いだ文字列が長くなりすぎるとバグる、不安定になります、

202 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 02:27:41 ]
>>199
互いの単語の相関からマップを作って無駄な検索をしないで済むアルゴリズムは存在するけど
名前を思い出せない

203 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 02:36:40 ]
まともな正規表現エンジンは単純なORだとかなり最適化できるから自分で適当に組むよりは早くなるとおもうよ。

204 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 02:39:11 ]
>>201
長くなりすぎるとバグる正規表現エンジンってどれ?

205 名前:199 mailto:sage [2009/10/24(土) 02:39:58 ]
ローリングハッシュ+ブルームフィルタと、鬼車で速度比較してみます。前者を今から作ってみます。
ここで複数同時検索見つけました。 ラビン-カープ文字列検索アルゴリズム - Wikipedia

206 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 02:41:22 ]
>>204
秀丸と、Regrepに入ってる正規表現dllです。秀丸の場合、最大文字数制限があるんですが。

207 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 02:59:25 ]
TR1の正規表現でいいだろ。

208 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 03:25:14 ]
>>199
検索文字列がそれだけなら
適当に作ってみようか?

209 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 03:35:06 ]
おねがいします

210 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 04:21:34 ]
>>199 検索文字列が短いのでハッシュに用いる文字数を先頭4文字だけにした。 うーん我ながら酷いコードだ
#include<map>
#include<string>
#include<cstdio>
unsigned long get_hash(const unsigned char *p){
unsigned long hash=0;
for(int i=0;i<4;i++) hash=(hash<<8)|p[i];
return hash;
}
int main(void){
char *wordlist[]={"HTML","html","?XML","?xml","<BODY","<body",NULL};
unsigned long hash=0;
std::map<unsigned long, std::string> wordmap;
std::map<unsigned long, std::string>::iterator it;
FILE *fp;
if((fp=fopen("hoge.txt", "rb"))==NULL) return 1;
for(int i=0;wordlist[i];i++) wordmap[get_hash((unsigned char*)wordlist[i])]=wordlist[i];
fseek(fp, 0, SEEK_END);
size_t filesize=ftell(fp), pos=0;
fseek(fp, 0, SEEK_SET);
char buf[filesize+1];
fread(buf, 1, filesize, fp);
buf[filesize]='\0';
for(int i=0;i<filesize;i++){
hash=(hash<<8)|(unsigned char)(buf[i]);
if((it=wordmap.find(hash))!=wordmap.end()){
if(strncmp(buf+i-(4-1), it->second.c_str(), it->second.length())==0)
printf("%s found at pos %d.\n", it->second.c_str(), i-(4-1));
}
}
fclose(fp);
return 0;}



211 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 04:59:56 ]
>>199 C言語で書き直してみた
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
unsigned long get_hash(const unsigned char *p){
unsigned long hash=0, i;
for(i=0;i<4;i++) hash=(hash<<8)|p[i];
return hash;
}
#define HASH_TABLE_SIZE 1031
int main(void){
unsigned char *buf, *p, *wordlist[]={"HTML","html","?XML","?xml","<BODY","<body",NULL};
unsigned char *hash_table[HASH_TABLE_SIZE]={NULL};
unsigned long filesize, i, j, flag, hash=0;
FILE *fp;
if((fp=fopen("hoge.txt", "rb"))==NULL) return 1;
for(i=0;wordlist[i];i++) hash_table[get_hash(wordlist[i])%HASH_TABLE_SIZE]=wordlist[i];
fseek(fp, 0, SEEK_END);
filesize=ftell(fp);
fseek(fp, 0, SEEK_SET);
buf=calloc(filesize+1, sizeof(*buf));
fread(buf, sizeof(*buf), filesize, fp);
for(i=0;i<filesize;i++){
hash=(hash<<8)|(buf[i]);
if((p=hash_table[hash%HASH_TABLE_SIZE])){
flag=(strncmp(buf+i-(4-1), p, strlen(p))==0); // 毎回 strlen するのは無駄なので工夫してね
for(j=0;!flag && (p=wordlist[j]);j++) flag|=(strncmp(buf+i-(4-1), p, strlen(p))==0); // 毎回 strlen するのは無駄なので工夫してね
if(flag) printf("%s found at pos %lu.\n", p, i-(4-1));
}
}
free(buf); fclose(fp); return 0;
}

212 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 05:18:52 ]
サンクス。 自分でラビン-カープ文字列検索を作ってるけど、
文字列長が一定だといいけど
一文字や二文字程度が入ってくると、パフォーマンスが落ちるね。

213 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 05:20:57 ]
>>212
>>210,211 は検索文字列が4文字未満だと動かないよw

214 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 14:15:53 ]
先頭2バイト一致するか調べたら簡単で速い気がしてきた。
ヒットしたら完全一致調べる。
ラビン-カープ文字列検索は一回ごとのハッシュ計算に手間かかる。

215 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 14:45:55 ]
先頭2バイトが登録されていたら完全一致調べる方法。

#include <iostream>
#include <vector>
#include <string>
using namespace std;
#define str2int(x) *(unsigned short int*)x

int main(){
unsigned int n, k;
vector<unsigned char> chk(1<<16, 0);
vector<string> findstr;
findstr.push_back("HTML");findstr.push_back("html");findstr.push_back("?xml");findstr.push_back("?XML");findstr.push_back("<body");findstr.push_back("<BODY");
for(n=0; n<findstr.size(); n++) chk[ str2int( &findstr[n][0] ) ]=1;
string s = "nbtgfhsdfmrjgijmhimhtmljdtiohbjfguhndug" ;
char findflg=0;
for(k=0; k < s.size()-1; k++)
if (chk[ str2int( &s[k] ) ] ==1 )
for(n=0; n < findstr.size(); n++ )
if( memcmp( &s[k], &findstr[n][0], findstr[n].size() )==0 ) { findflg=1; goto end; }
end:
if(findflg) cout<<k+1<<" moji me de hit\n"; else cout<< "not found\n"; }

216 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 16:54:08 ]
>>215
それは実測で速くなったの?

217 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 17:12:41 ]
いまからテキスト(html)で実測してみる

218 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 17:39:08 ]
複数箇所にまたがって使う可能性のあるクラス(Factoryやその生成物、利用クラス)はポインタの形式を統一したほうがいいですよね?
それとも早いのと賢いので細かく使い分けるべきですか?


219 名前:199 mailto:sage [2009/10/24(土) 18:24:09 ]
実測したよ。
tr1::regexは結果が間違えてるんだが。
211さんのはテストケースに書き換えるのが面倒で入れなかった。


215の方法 178秒
一つ一つstring::findで調べる方法 280秒
正規表現 鬼車  590秒
vc++2008 tr1::regex 868秒

220 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 18:35:17 ]
ここまでboost::xpressive無し



221 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 18:40:05 ]
strstrもなし。

222 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 18:42:22 ]
正規表現なら鬼車がいいだろ
Ruby(オリジナル版には入ってないかも)、桜エディタ、
Bregexp.dllの後継bregonig.dllに使われている。

223 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 18:46:30 ]
インラインアセンブラもなし

224 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 18:49:35 ]
215より速くできる方法あるの

225 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 18:51:29 ]
vector<string>に複数の文字列を定義時に登録する方法ありますか?

226 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 18:52:25 ]
C++0x対応コンパイラに乗り換える

227 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 19:01:01 ]
static int fnc(); と int fnc();は何が変わるんですか。

228 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 19:03:15 ]
自己解決
ひとつのファイル内のみで使用できるって事ですか。

229 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 22:06:29 ]
仮想関数ってポインタアクセスしてるらしいし、つまりinlineしても無駄無駄ですよね?


230 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 22:09:06 ]
インライン化できるならコンパイラが勝手にやるよ



231 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 22:24:29 ]
これらって同じかと思ってミスりました。

memcmp( buf, "\x20\x45\x4D\x46", 4);
memcmp( buf, "0x200x450x4D0x46", 4);
memcmp( buf, "0x20454D46", 4);

232 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 00:04:57 ]
KMP とか AC とかあるよ


233 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 00:06:11 ]
KMP じゃなくて CW だった。

234 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 09:36:21 ]
反復子の正しい初期化方法を教えてください。
演算子のオーバーロードで初期化できる反復子は問題ないのですが
そうでない、反復子はどのように初期かするのがベストなのでしょうか?
template<class Iterator>
class Foo {
private:
Iterator lite_; //ok
Iterator rite_; //ok
Iterator it_; //?
Iterator p_; //?
public:
Foo() : it_(0), p_(0){} //これがベストなのでしょうか?
Foo( Iterator lite, Iterator rite ) : lite_(lite), rite_(rite){}
};

235 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 09:46:31 ]
>>234
一般的にコンテナのインスタンスに依存せずに要素を指さない有効なイテレータを作る方法はないし、
nullや0から変換できるとも限らない。

236 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 09:52:13 ]
>>235 thxです
>nullや0から変換できるとも限らない。
なるほど、やはりそうですか自分もそんな気がしていました
なので、nullや0から変換する方法というのは、他に方法が無い場合仕方無しにやってます。

237 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 11:06:39 ]
boost::optionalとかどう?

238 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 11:40:01 ]
boost は何でもあるんですね、また驚きました、参考にさせてもらいます。

239 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 13:28:38 ]
クラステンプレートでoperator() はオーバーライドすることが可能でしょうか?
もしできるならば、簡単な雛形を教えてください
それからSFINAE の使い方で、関数テンプレートの事例は検索すれば
いくつか出てきますし、「C++テンプレートテクニック」という本を読んでやり方は分かるのですが
クラステンプレートの事例が検索できません、もしかしてSFINAE はクラステンプレートには適用できないのでしょうか?
ここで言うクラステンプレートとは
template<class T>
class Foo {};
このような形式のことを意図します。
コンパイラはvs2005です。

240 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 13:29:34 ]
基底クラスがないのにオーバーライド?



241 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 14:54:02 ]
>>239
ファクトリー関数を挟めば適用できるよ

242 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 16:54:33 ]
>>239 です
>>241 さんありがとうございます、ファクトリー関数を検索したのですが、具体的にイメージができません
下記のFooクラスおHogeクラスの間で継承関係を持たせ、operator() を自在に呼び出せないでしょうか。
#include <algorithm>
#include <iostream>
#include <vector>
template<class T>
class Foo {
typedef typename std::iterator_traits<T>::value_type value_type;
public:
void operator()( const value_type& val )
{ std::cout << val << "\n"; }
};
template<class T>
class Hoge {
public:
typedef typename std::iterator_traits<T>::value_type value_type;
int operator()(const value_type& val)
{ return val; }
};
int main()
{
std::vector<int> lhs, rhs; lhs.push_back(1); lhs.push_back(2); lhs.push_back(3);
std::for_each(lhs.begin(), lhs.end(), Foo<std::vector<int>::iterator>());
std::transform(lhs.begin(), lhs.end(), std::back_inserter(rhs), Hoge<std::vector<int>::iterator>());
copy(rhs.begin(), rhs.end(), std::ostream_iterator<int>(std::cout, " "));
return 0;
}

243 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:17:55 ]
どういう動作をしてほしいのかわかりません

244 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:29:41 ]
>>243
継承により基底クラスのメンバー関数を使いたいのですが、今回の場合はどちらが基底クラスになってもかまいませんが
仮にFoo クラスに
int Widget();
というような関数が定義されて、基底クラスとした場合、Hoge クラスでそれを使えることはもとより
operator() も呼び出せるようにしたいのですが。

245 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:33:49 ]
using Foo<T>::operator ();

246 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:39:10 ]
>>245
それは何処に記述して、main() からどのように呼び出したらいいのでしょうか?

247 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 18:24:01 ]
>>242
無理。その二つのoperatorはそもそも継承可能な同一性を持たないから。

248 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 18:56:58 ]
そうですか、ありがとうございます
int operator() とvoid operator () と違うから継承不可能なのでしょうか?

249 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 21:30:24 ]
インターフェースにコピーコンストラクタや代入ってつけないほうがいいですか?
ぜんぜん違う実装同士だとすごい困るんですけど・・・

250 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 21:35:12 ]
>>249
付けて困るんなら付けなきゃいいじゃん。



251 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 07:53:47 ]
コンストラクタから、オーバーロードされたコンストラクタを呼び出すってアリなんですか?
class CHoge {
public:
 CHoge(int x) { CHoge((float)x); }
 CHoge(float x) { ... }
};

252 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 08:11:51 ]
0xではアリ






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

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

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