■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part54
251 名前:デフォルトの名無しさん :2006/11/06(月) 22:32:39
>>244
それ、コンパイラ何使ってる?
コピーコンストラクタをユーザー定義するかどうかで
一時オブジェクトの有無が変わる理由がわからん。

252 名前:244 :2006/11/07(火) 01:04:15
>>245
変わってるんですが、なぜかわからなかったもので。
引数と戻り値の受け渡し時のコピーがらみかなとも思ったんですが
調べてもわからなかったもんで。

デストラクタが3回呼ばれるのが謎で
コピーコンストラクタの呼び出しをチェックしようとしたら
デストラクタが2回しか呼ばれなくなってわからなくなりました…

>>247
 GCCではどちらも2回なんですね。コンパイラ依存?

 VS2005 C++を使ってるんですが、デバッグ用なので
 最適化オプションは無効になってますが、
 その最適化とは違うことだとすると
 ユーザ定義のコピーコンストラクタがない場合のみ
 一時オブジェクトが2個作られてるって事でしょうか。調べてみます。

>>251
 VS2005 C++です。
 私もその理由がわからなくて悩んでます。
 >>247 の最適化による除去が濃厚そうですね。


253 名前:デフォルトの名無しさん :2006/11/07(火) 01:23:19
A := B | C | D
B = a | bc

みたなBNFをtemplate使って書いてみたいんですけどどうやって書けばいいの?

254 名前:デフォルトの名無しさん :2006/11/07(火) 01:45:09
一体全体どこにtemplateを使うって?

255 名前:デフォルトの名無しさん :2006/11/07(火) 02:04:10
>>253
つ[Boost.Spirit]

256 名前:デフォルトの名無しさん :2006/11/07(火) 02:04:34
>>251
ユーザー定義のデストラクタはあり、
ユーザー定義のコピーコンストラクタはない
バランスが取れてないのでVC++は除去しないと見た
ベンダに聞かないと分からんけどなw

257 名前:デフォルトの名無しさん :2006/11/07(火) 02:18:36
std::map<std::string, A *> m;
っていうコンテナ作りました。

これだと、Aを丸々コピーしなくても問題ないですよね?

あと格納したオブジェクトをoperator()を実装して呼び出せば
関数呼び出しのコストはかからないですよね?

258 名前:デフォルトの名無しさん :2006/11/07(火) 02:29:13
>>257
sizeof(A *)のコピーしか無いだろうが、ポインタの参照先については責任を持たなきゃならんな。


>あと格納したオブジェクトをoperator()を実装して呼び出せば
A::operator () () であろうが、void A::func()であろうが、所詮は同じ「関数」。

259 名前:デフォルトの名無しさん :2006/11/07(火) 10:02:19
>>253
ttp://p-stade.sourceforge.net/biscuit/index.html

typedef seq<
 chseq<'/','*'>,
 star_until< any, chseq<'*','/'> >
> c_comment;

std::string text("/* Hello, Biscuit! */");
if (biscuit::match<c_comment>(text)) {
 //...
}


260 名前:デフォルトの名無しさん :2006/11/07(火) 10:29:34
http://www.open-std.org/jtc1/sc22/wg21/
News 2006-11-06: C++ Standard Core Language Issues List (Revision 44) is available

261 名前:244 :2006/11/07(火) 15:23:23
下記のコードでfunc2()の引数objが初期化される時に
ユーザ定義コピーコンストラクタありだと
 c obj = c() ;
ユーザ定義コピーコンストラクタなしだと
 c tmp = c() ; c obj = c ;
となるみたいです。

DEBUG版だから最適化無効になっているはずなんですけどね。
コンパイラの最適化の話ではなく、C++の言語仕様なんだろうか。
--
struct c
{
c(){ cout << "c ctor" << endl ; }
//c( const c &obj ){cout << "c copy ctor" << endl ;}
~c(){ cout << "c dtor" << endl ;}
} ;

void func2( c obj ) {cout << "func2" << endl ; }

で、以下をユーザ定義コピーコンストラクタあり/なしで実行すると、
func2( c() ) ;

ユーザ定義コピーコンストラクタあり
c ctor
func2
c dtor

ユーザ定義コピーコンストラクタあり
c ctor
func2
c dtor
c dtor

262 名前:デフォルトの名無しさん :2006/11/07(火) 16:08:46
実行結果をノートパッドなどに出力する方法教えてください・・・

263 名前:262 :2006/11/07(火) 16:09:18
スレ違いでしたすいません

264 名前:デフォルトの名無しさん :2006/11/07(火) 16:13:26
動的な型決定みたいなことをしたいのですが、どこかに適当なサンプルコードなどないでしょうか

template< Any>//??
Any detAnyFromIndex(int index)
{
if(index==0)
return( (char)(... ) )
if(index==1)
return( (int)(... ) )
if(index==2)
return( (double)(... ) )
}


265 名前:デフォルトの名無しさん :2006/11/07(火) 16:45:52
>>264
templateをなんだと思ってるんだ?

最近template関係の質問多くなったな
それもアホみたいなのが。
流行ってんの?

266 名前:264 :2006/11/07(火) 17:04:54
templateでなくてもいいのだけど
関数の返す方を動的に変えたい
boost::any detAnyFromIndex(int index)
だと、データを取り出すときに結局
boost::any_cast<float>(output )
が必要になって処理が後回しにされるだけで解決にならない

267 名前:デフォルトの名無しさん :2006/11/07(火) 17:14:17
無理

268 名前:デフォルトの名無しさん :2006/11/07(火) 17:32:39
>>266
型は静的なものだから、動的に取得することは出来ません。

269 名前:デフォルトの名無しさん :2006/11/07(火) 17:39:08
できるもん!

270 名前:デフォルトの名無しさん :2006/11/07(火) 17:55:02
ドラえもん!

271 名前:デフォルトの名無しさん :2006/11/07(火) 17:55:20
>>266
その自身たっぷりんりんの発言はどこから来るんだ?
さっさとしね

272 名前:デフォルトの名無しさん :2006/11/07(火) 18:00:22
>>266
やりたいことを明確に汁

273 名前:デフォルトの名無しさん :2006/11/07(火) 18:06:21
>>264>>266
できません。

274 名前:264 :2006/11/07(火) 18:06:45
>>271
なぜに自身たっぷり?
よくわからないけど、プリプロセッサでなんとかできないか試してみる

275 名前:デフォルトの名無しさん :2006/11/07(火) 18:10:10
>>274
できません。

276 名前:デフォルトの名無しさん :2006/11/07(火) 18:13:04
>>274
できないっつってんだろうがボケww
プリプロセッサとか・・w
もう一度template勉強しろ


277 名前:264 :2006/11/07(火) 18:14:27
自己解決
boostのHPにあったサンプルで解決できそうです

#define ARITHMETIC_TYPE(I) ARITHMETIC_TYPE ## I

#define ARITHMETIC_TYPE0 bool
#define ARITHMETIC_TYPE1 char
#define ARITHMETIC_TYPE2 signed char
#define ARITHMETIC_TYPE3 unsigned char
#define ARITHMETIC_TYPE4 short
#define ARITHMETIC_TYPE5 unsigned short
#define ARITHMETIC_TYPE6 int
#define ARITHMETIC_TYPE7 unsigned int
#define ARITHMETIC_TYPE8 long
#define ARITHMETIC_TYPE9 unsigned long
#define ARITHMETIC_TYPE10 float
#define ARITHMETIC_TYPE11 double
#define ARITHMETIC_TYPE12 long double


278 名前:デフォルトの名無しさん :2006/11/07(火) 18:16:05
>>277
できません。

279 名前:デフォルトの名無しさん :2006/11/07(火) 18:16:25
「 t e m p l a t e 」で、「 動 的 な 型 決 定 み た い な こ と 」をしたいのですが、できません><
boost使っても出来ません><;;;;
どうすればできますか???
プリプロセッサ使えばできるんですか><

280 名前:デフォルトの名無しさん :2006/11/07(火) 18:17:11
本人が満足してんだからほっとけ。
やりたいことは分かったしそれが最適だと思うなら勝手にしろ

281 名前:264 :2006/11/07(火) 18:17:37
>>278
バカの一つ覚えみたいにうるせーよ
できねーってゆうならその証拠みせろ

282 名前:デフォルトの名無しさん :2006/11/07(火) 18:19:24
>>281
マクロはコンパイル時に展開されますから、動的な処理は行えません。
相談室で相談に対して正解教えてるのにその口ぶり・・・酷ス

283 名前:デフォルトの名無しさん :2006/11/07(火) 18:23:35
自分で Variant 型でも作ってみたら?

284 名前:デフォルトの名無しさん :2006/11/07(火) 18:23:55
ふむ。。。
具体的な例がでてないから、やきもきするのはわかるが、
その態度は気にくわんな
学生さん?

285 名前:264 :2006/11/07(火) 18:27:11
>>282
確かにできませんでした。
あきらめます。

286 名前:デフォルトの名無しさん :2006/11/07(火) 18:28:42
出来ないことの具体例ってのは難しいな。

287 名前:デフォルトの名無しさん :2006/11/07(火) 19:13:33
union

288 名前:デフォルトの名無しさん :2006/11/07(火) 19:23:51
C++かWinAPIかちょっと判断できなかったんでこちらで質問させてください
リソース管理クラスの目的で関数ポインタをメンバにしようとしてるんですが、
呼び出し規約が違うと関数ポインタに代入できないようで困ってます。
(今は各規約のポインタとコンストラクタを持ってる)
呼び出し規約ってのはtemplateで決定できないんでしょうか?

#include <windows.h>
template <typename T, typename R = void>
class AutoResource {
T resource;
R (/*WINAPIV*/WINAPI *killFunc)(T);
//  ↑ここをtempleateに
public:
AutoResource(T res, R (/*WINAPIV*/WINAPI *func)(T) ) : resource(res), killFunc(func) {}
~AutoResource() { (this->killFunc)(this->resource); }
};

void f(HMODULE h) { FreeLibrary(h); }
int main() {
AutoResource<HMODULE, BOOL> res(LoadLibrary(TEXT("freetype.dll")), FreeLibrary);
//AutoResource<HMODULE> ress(LoadLibrary(TEXT("shell32.dll")), f);
return 0;
}

コンパイラはVC8です

289 名前:デフォルトの名無しさん :2006/11/07(火) 19:48:09
>>288

template< typename T, typename R > struct killer_base
 : public std::unary_function< T, R > {
 virtual ~killer_base() {};
 virtual R operator()( T ) = 0;
};
template< typename F, typename T, typename R > struct killer
 : public killer_base<T,R> {
 F f;
 killer( F func ) : f(func) {}
 R operator()( T t ) { return f(t); }
};
template <typename T, typename R = void>
class AutoResource {
T resource;
auto_ptr< killer_base<T,R> > const killFunc; // noncopyable
public:
template< typename KillerFunc >
AutoResource(T res, KillerFunc func )
 : resource(res), killFunc(new killer<KillerFunc,T,R>(func)) {}
~AutoResource() { (*killFunc)(resource); }
};

290 名前:デフォルトの名無しさん :2006/11/07(火) 19:49:37
>>288
boost::function

291 名前:デフォルトの名無しさん :2006/11/07(火) 20:03:57
よこからすまん。
>>289のkiller_baseって何で必要なの?

292 名前:デフォルトの名無しさん :2006/11/07(火) 20:22:53
AutoResourceのコンストラクタの時点で関数の型が決定するから

293 名前:デフォルトの名無しさん :2006/11/07(火) 20:28:46
>>291
boost::shared_ptr の sp_counted_base と、sp_counted_impl みたいなもの。
コンストラクタ呼び出しで渡された型を保存しておくための方法。



294 名前:デフォルトの名無しさん :2006/11/07(火) 20:41:12
>>289
(゚д゚)スゲー とりあえず意図したとおりのものになりました
ありがとうございます



内容はまだ理解できてないけどな! 

295 名前:デフォルトの名無しさん :2006/11/07(火) 21:19:13
>>271
人格障害の診断をうけたほうがいいぞ

296 名前:デフォルトの名無しさん :2006/11/07(火) 22:19:59
>>292>>293

すまん。
まったくわからん。

297 名前:デフォルトの名無しさん :2006/11/07(火) 22:46:18
>>296
ああすることによって、killer<F, T, R>型(のうち具体的にはF)がなんであっても
統一的に基底クラスであるkiller_base<T, R>型のオブジェクトとして取り扱えるようになる。

boost::functionなんかも同じようなことをやっている。

298 名前:デフォルトの名無しさん :2006/11/07(火) 23:01:36
あああああああああああOK
理解した。ありがつ。

299 名前:デフォルトの名無しさん :2006/11/07(火) 23:47:53
#include "stdafx.h"
#include <limits.h>

int _tmain(int argc, _TCHAR* argv[])
{
int n,max=INT_MIN,min=INT_MAX;
bool flag=true;
do{
printf("整数を入力してください。");
scanf_s("%d",&n);
if(n==0) flag=false;
if(n>max) max=n;
else if(n<min) min=n;
}while(flag);
printf_s("\n最大は%d 最小は%dです。\n",max,min);

return 0;
}


VC++ Proでこれを実行すると0を入力したとき
コマンドプロント閉じちゃうんですがどうしたらいいんですか

300 名前:299 :2006/11/07(火) 23:51:01
あ、できました。

301 名前:デフォルトの名無しさん :2006/11/07(火) 23:54:46
ああ、答えをいただいて3時間超、ようやく判った。
ありがとう、おめでとう。

302 名前:デフォルトの名無しさん :2006/11/08(水) 00:03:32
ところでOperator()って何のためにあるの?
意味不明。関数ポインタでいいじゃん

303 名前:デフォルトの名無しさん :2006/11/08(水) 00:24:23
ステートを持たせることができる

304 名前:デフォルトの名無しさん :2006/11/08(水) 00:25:31
そんなもん構造体引数に渡せばいいだろ

305 名前:デフォルトの名無しさん :2006/11/08(水) 00:31:13
for_eachアルゴリズムの第三引数とか。
だんだんチラシの裏っぽくなってきた。

306 名前:デフォルトの名無しさん :2006/11/08(水) 00:34:19
>>302
D&Eには、理由がない限りどの演算子も多重定義できるようにしたというようなことが書いてある。
そもそも導入された理由はその流れだろう。

>>304
Windows APIのコールバック関数ではそういう風になっているな。
だが、operator ()を使って(というよりboost::bindなんかで束縛してやって)のほうが、スマートだと俺は思う。
STLを考えた偉い人もたぶんそんなことを考えたのだろう。

307 名前:デフォルトの名無しさん :2006/11/08(水) 00:35:19
型で管理できる。

308 名前:デフォルトの名無しさん :2006/11/08(水) 00:37:45
templateで渡せる。

309 名前:デフォルトの名無しさん :2006/11/08(水) 00:40:02
>>308
tmplateでどうやって渡すの?
サンプル教えて

310 名前:デフォルトの名無しさん :2006/11/08(水) 00:50:37
template<typename FUNC>
void call_funcobj(FUNC f)
{
f("hello,world") ;
}

void func(std::string const & message)
{ std::cout << message << std::endl ; } ;


class FuncObj
{
std::string header_ ;
public :
FuncObj(std::string const & header) : header_(header) { }
void operator() (std::string const & message)
{ std::cout << header_ << message << std::endl ; }

} ;

int main()
{
call_funcobj(func) ;
FuncObj f1("message : "), f2("メッセージ:") ;
call_funcobj(f1) ;
call_funcobj(f2) ;
}

311 名前:デフォルトの名無しさん :2006/11/08(水) 01:07:07
メンバ関数を呼び出させることができるのも便利だと思っている。
class Window
{
    // ...
public:
    void SetTitle(const std::string&);
    // ...
};

void f()
{
    Window w;
    call_funcobj(boost::bind(&Window::SetTitle, w, _1));
}

312 名前:デフォルトの名無しさん :2006/11/08(水) 02:59:48
http://www.open-std.org/jtc1/sc22/wg21/
News 2006-11-07: The 2006-09 mailing is available

Working Draft の新しい奴 n2134.pdf がうpされてる。

313 名前:デフォルトの名無しさん :2006/11/08(水) 03:45:37
どなたか ↓ のコードを utf8 化する方法を教えてください。

ttp://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/kasumi/kasumi2/

314 名前:デフォルトの名無しさん :2006/11/08(水) 05:02:17
>>313
つ[iconv]

315 名前:デフォルトの名無しさん :2006/11/08(水) 13:40:34
>>302
関数ポインタより効率がよくなるから

316 名前:デフォルトの名無しさん :2006/11/08(水) 18:59:29
ポインターからtypedefするにはどうすればいいのか
どなたかお教えいただけないでしょうか

struct sttest
{
typedef int myint;
};
typedef sttest * psttest;
typedef psttest->myint mymyint;
こんな感じのtypedefをしたいのですが構文エラーe2143などとなって
コンパイルできません

317 名前:デフォルトの名無しさん :2006/11/08(水) 19:11:52
>>316
何がしたいんだ?
typedefは型を定義するものだよ

318 名前:デフォルトの名無しさん :2006/11/08(水) 19:16:24
typedef sttest::myint mymyint;
こういうことがやりたいのかな?

319 名前:316 :2006/11/08(水) 19:16:52
したいことは

psttestしか受け取れないclassの中でstruct sttest で定義した
ypedefの情報をうけとりたいのです

template<typename Ptr = psttest>
class MyClass
{
typedef Ptr::myint mymyint;
};

320 名前:デフォルトの名無しさん :2006/11/08(水) 19:17:22
ESP の訓練をかねて >>316 の思考を読んだ結果

typedef sttest::myint mymyint

がしたいんじゃないかと感じた。

321 名前:316 :2006/11/08(水) 19:32:45
ポインターを渡すようにクラスMyClass を設計してしまったため
ポインターが持ってるtypedefの情報を渡すことができなくなって
しまったので、なんとか解決したい。というのがやりたいことです。

322 名前:デフォルトの名無しさん :2006/11/08(水) 19:38:51
>>321
ポインタがtypedefの情報もってるって…何か壮大に勘違いしてないか?

323 名前:デフォルトの名無しさん :2006/11/08(水) 19:49:41
>>316がしたい事は別の構文で書くと、

typedef a+b c と同じような事だと思った。

324 名前:デフォルトの名無しさん :2006/11/08(水) 20:02:22
template<typename T> struct RemovePointer
{ typedef typename T::myint type; };

template<typename T> struct RemovePointer<T*>
{ typedef typename T::myint type; };

typedef RemovePointer<psttest>::type mymyint;

325 名前:デフォルトの名無しさん :2006/11/08(水) 20:08:53
なるほど、ポインタ型で特殊化するわけか・・・

326 名前:316 :2006/11/08(水) 20:11:52
>>324
できました
感謝

327 名前:デフォルトの名無しさん :2006/11/08(水) 20:53:06
vector<vector<double>* > v;

vectorに値を格納していって、

for(int i = 0; i < n; i++){
for(int j = 0; j < x; j++)
cout << (*v[i])[j] << endl;
}
で表示するんですけど、

(*v[i])[j] ってどういう意味なんでしょうか?
不勉強で申し訳ないのですが、ご教授をお願いできないでしょうか?

328 名前:デフォルトの名無しさん :2006/11/08(水) 20:56:19
>>327
v の i 番目 (0から数える。以下も同様) に入っているポインタが指す先にある
vector<double>型のインスタンスの、j番目の要素への参照。

329 名前:デフォルトの名無しさん :2006/11/08(水) 20:57:57
>>327
おかしくないか?
*v[i][j]だと思うが。

330 名前:デフォルトの名無しさん :2006/11/08(水) 20:59:54
すまん
vector<double*>と勘違いしてた。

331 名前:デフォルトの名無しさん :2006/11/08(水) 21:02:34
>>328
ありがとうございます!
助かりました!

>>329
参考書をそのまま写したんですが、
おっしゃる通りにやってみたところ、
エラーになりました。

332 名前:デフォルトの名無しさん :2006/11/08(水) 21:03:06
はい。勉強になりました。

333 名前:デフォルトの名無しさん :2006/11/08(水) 22:18:37
>>322-323

なかなかのバカ丸出しぶりでしたな

334 名前:デフォルトの名無しさん :2006/11/08(水) 22:41:12
316よりましだけどな。

335 名前:デフォルトの名無しさん :2006/11/08(水) 22:47:32
template も知ってるようだし、「何かやり方があるんじゃないか」と
感づくあたりだけ 316 の方がましだと思う。
文法めちゃくちゃでも一応コンパイルしてみる勇気も買うw

「ポインター」じゃなくて「ポインター型」と書いていればもっと良かったけど。

336 名前:デフォルトの名無しさん :2006/11/08(水) 23:12:54
関数ポインタより効率いいっていうけど嘘じゃね?
どうアセンブラのコードとにらめっこしても
そんなコードはいてねぇよ

337 名前:デフォルトの名無しさん :2006/11/08(水) 23:53:35
って関数オブジェクトのことな

338 名前:デフォルトの名無しさん :2006/11/09(木) 00:07:15
>>336
template<typename Function> void call(Function f) { f(); }

Function が関数ポインタなら、おそらくインライン展開は行われない。
Function が関数オブジェクトなら、普通にインライン展開の対象になる。

339 名前:デフォルトの名無しさん :2006/11/09(木) 01:10:02
ちょっと質問。

Named Template Parameterの情報って、どのへんを調べれば出てくる?
ttp://www.kmonos.net/alang/cpp/glossary.html
にさわりだけ出てるんだが、もうちょっと具体的なやつが見つからなくて。


340 名前:デフォルトの名無しさん :2006/11/09(木) 02:03:12
質問です。
クラステンプレートの中にメンバ関数テンプレートがあります。

template< typename T >
class MyClass {
public:
  template< typename U > void f( const U& u );
};

この関数f()をクラスの宣言外で定義する書き方が分かりません。
どなたか分かる方がいらっしゃればご教示願います。

以上、宜しくお願いいたします。

341 名前:デフォルトの名無しさん :2006/11/09(木) 02:11:22
template< typename T >
template< typename U >
void MyClass<T>::f( const U& u ) {
...
}


342 名前:デフォルトの名無しさん :2006/11/09(木) 02:38:28
>>339 http://www.google.co.jp/search?q=%22Named+Template+Parameter%22

343 名前:デフォルトの名無しさん :2006/11/09(木) 03:01:56
>>342
や、そのぐらいはしてある。

…といいつつ出てきたエントリをうろちょろしてたら、
わりといいのが見つかった。thx。
ttp://d.hatena.ne.jp/uskz/20060607/p1

まあ何となくはわかった気になれた。
もうちょっとちゃんと知りたいなら、"C++ Templates" を読めという感じらしい。


344 名前:デフォルトの名無しさん :2006/11/09(木) 06:35:32
ModernC++Design読んで満足してた俺はだめだなぁ・・・
これが思考停止ってやつですかorz

NTPすげー

345 名前:デフォルトの名無しさん :2006/11/09(木) 07:34:43
struct B{ typedef int H; };
struct D1 :public B {};
struct D2 :public B {};
class DD1 :public D1, public D2{};

int main(){
 printf( "%d\n", sizeof( DD1::H ) );
 return 0;
}

これコンパイル通ったんだが、
typedefの場合はメソッドとかと違って曖昧無しにコンパイラが解決してくれるの?

346 名前:デフォルトの名無しさん :2006/11/09(木) 09:12:40
>>345
D1::H と D2::H が同じものを指すので、 DD1::H という名前の検索自体は問題ない。

曖昧な基底クラスでエラーになるのは、そっから先の使い方によるらしい。
(4.11-2, 5.2.5-5)

347 名前:デフォルトの名無しさん :2006/11/09(木) 11:06:22
>>345
その場合、関数だと曖昧だけどtypedefの場合は大丈夫らしい
NTPの場合は仮想継承を使って基底クラスのtypedefしたものをoverrideしてる。
class B; // typedef int H;
class D1 :virtual public B; //typedef char H;
class D2 :virtual public B; //なにもしない
class DD1 :public D1, D2;
で、DD1::Hはcharになる。
ただの継承だとHは名前解決失敗するっぽい
名前解決は複雑だなー、、、

348 名前:デフォルトの名無しさん :2006/11/09(木) 12:21:06
NTP じゃないが、ソレに近いもの。
policy_category を使って、SmartPtr のポリシーを自動判別。
http://www.cuj.com/documents/s=8890/cujexp0310alexandr/
3年前にこれを見たとき、正直感動した。

smart_ptr<T, storage<_> > でもいいし、
smart_ptr<T, ref_counted<_> > でもいい。

349 名前:デフォルトの名無しさん :2006/11/09(木) 12:58:20
菱形継承使わなくても(というか菱形継承使った NTP 実装は面倒),
最近は Boost.MPL でかなり高度なTMP の土台が用意されているので,
そちらを使えばもっと直接かつ見通しの良い形で実装できるような気もします.

http://thread.gmane.org/gmane.comp.lib.boost.devel/81060/focus=81080

350 名前:デフォルトの名無しさん :2006/11/09(木) 13:01:34
>>338
この程度の単純なコールバックだと,コンパイル時評価可能な
関数ポインタ値ならインライン展開しうるコンパイラもあります. MSVC とか.

351 名前:デフォルトの名無しさん :2006/11/09(木) 16:38:09
コード晒してから言え

352 名前:デフォルトの名無しさん :2006/11/09(木) 16:51:54
角度とか.


353 名前:デフォルトの名無しさん :2006/11/09(木) 17:06:38
ぶっちゃけ、boostの使い方を勉強する方がいいと思った > 複雑なtemplateテクニックを書くより

354 名前:デフォルトの名無しさん :2006/11/09(木) 17:16:23
>>348
わかんねー(´д`;
<_>とか、boost::mplがわからんです。
というかboost使ったことない・・・


355 名前:デフォルトの名無しさん :2006/11/09(木) 17:24:32
>>354
とりあえずlambdaだけ使って味噌。
笑うくらいスッゲェーとか思うから。

後は興味が354を導くはず


356 名前:デフォルトの名無しさん :2006/11/09(木) 17:24:48
>>354
ref_counted<_> は、lambda の _1 と同じく引数のプレイスホルダで、
この場合 T に展開される。
>>348 の smart_ptr< T, ref_counted<_> > は、コンパイル時に以下のように
書くのと同じ効果がある。

smart_ptr< T, ref_counted<T> >

357 名前:デフォルトの名無しさん :2006/11/09(木) 17:59:03
lambda って使うと実行ファイルのサイズがすげー事にならない?

358 名前:デフォルトの名無しさん :2006/11/09(木) 17:59:55
>>355>>356
ありがとうございます。
boostのラムダ読んでみます

359 名前:デフォルトの名無しさん :2006/11/10(金) 15:02:15
#pragma includepath
ってVS2005では使えないのでしょうか?
何かコード中でincludepathを設定する方法はないのでしょうか

360 名前:デフォルトの名無しさん :2006/11/10(金) 15:22:04
>>359
インクルードするときにフルパスで書けばいいんでね?
例えば #include "/usr/include/stdio.h"とか。
つーか、スレ違いだがね。

361 名前:デフォルトの名無しさん :2006/11/10(金) 23:31:20
あのさー
Cの構造体をC++のクラスにラップしたいんだけど

typedef stract a
struct a *next;
...
}A;

こんなかんじでnextで別のポインタ参照するような構造体を
ラップするときってどうしてる?


362 名前:デフォルトの名無しさん :2006/11/10(金) 23:38:32
>>361
こんなかんじ、といっても文法めちゃくちゃで何をしたいのか分からない。
構造体をクラスでラップするとはどういう意味?
とりあえず落ち着いて話せ。

363 名前:デフォルトの名無しさん :2006/11/10(金) 23:41:10
typedef stract a{
struct a *next;
...
}A;;
こんなのだよこんなの、


364 名前:デフォルトの名無しさん :2006/11/10(金) 23:43:18
意味がわからにあ

365 名前:デフォルトの名無しさん :2006/11/10(金) 23:44:02
class A {
A* next;
..
};

ってことか?

366 名前:デフォルトの名無しさん :2006/11/10(金) 23:45:45
>>363
これだけだと、どういうパターンを適用するのか判断が難しいなぁ。
単純なラップじゃなくなるけど、
自分ならstd::list + std::list::iteratorみたいに巡回と管理のクラスの二つにわけるかな。

367 名前:デフォルトの名無しさん :2006/11/10(金) 23:48:49
>>366
ふむふむそっかぁ、同じデータ構造なんだけど
全然別々の名前のリスト状のデータ構造があって

ベタにCのデータ構造操作する部分記述したくないんだけど
やっぱそうやるしかないかぁ

368 名前:デフォルトの名無しさん :2006/11/11(土) 00:06:58
掲示板をまるで会話のように使うとは。
言葉のニュアンスも読む人間の考えに任せるしかないのにそれは酷いだろう。
言葉を改めろよ。

369 名前:デフォルトの名無しさん :2006/11/11(土) 00:26:42
朝鮮人に何を言っても無駄。
自分の事しか考えてないんだから。

370 名前:デフォルトの名無しさん :2006/11/11(土) 00:37:53
テンプレートクラスに関する質問です。

template <class T>
class Sample
{
public:
   Sample(const T& t) : m_t(t){}
private:
   T m_t;
};

みたいな事をやったとき、class Tには何でも指定できてしまいますが、
このclass Tをあるクラスのサブクラスのみに指定したいのです。
どうしたら、いいのでしょうか?

環境は
vs2005 WinXPPro,SP2です。


371 名前:デフォルトの名無しさん :2006/11/11(土) 00:49:14
template <typename T>
class Sample
{
   BOOST_STATIC_ASSERT(boost::is_base_and_derived<あるクラス, T>::value);
public:
   Sample(const T& t) : m_t(t){}
private:
   T m_t;
};

372 名前:デフォルトの名無しさん :2006/11/11(土) 00:52:11
>>370
特殊化すればいいだけなんじゃないの?
本に書いてあることだよ?

373 名前:デフォルトの名無しさん :2006/11/11(土) 00:55:55
子供が全部public継承してるなら、テンプレートじゃなくて基本クラス要求すればいいんじゃない?

374 名前:370 :2006/11/11(土) 01:24:25
is_base_and_derivedでぐぐったら、それらしい情報が出てきました。
どうもありがとうございます。

375 名前:デフォルトの名無しさん :2006/11/11(土) 04:02:04
オペレータをオーバーロードして、
クラスAのポインタでクラスの中身(int t)を比較したいんですが、

bool operator< (A *a) const{
return (t < a->t);
}
bool operator> (A *a) const {
return (t > a->t);
}
とクラスに書いてやって、

A *a1 = new A;
A *a2 = new A;
a1->t = 2;
a2->t = 1;
これで、a1 > a2
をしても真にならないのですが、どこか間違ってますでしょうか?

376 名前:デフォルトの名無しさん :2006/11/11(土) 04:15:35
>>375
ポインタ同士の比較は配列の要素間の前後関係という意味になる。オーバーロードはできない。
そのオーバーロードの宣言は *a1 > a2 としたときに使われる。

377 名前:デフォルトの名無しさん :2006/11/11(土) 04:17:16
struct A {
int t;
bool operator<(const A& a) const{
return (t < a.t);
}
bool operator>(const A& a) const {
return (t > a.t);
}
};

int main()
{
A* a1 = new A;
A* a2 = new A;
a1->t = 2;
a2->t = 1;
std::cout << std::boolalpha << (*a1 > *a2) << std::endl;
}

378 名前:375 :2006/11/11(土) 05:04:06
>>376,377 なるほど、ありがとうございます。

ちなみに
priority_queue<A*, vector<A*, allocator<A*> >, greater<A*> >
にAをtの昇順に入れてやろうと思ったのですが、
おそらくそれが原因で上手くソート出来ませんでした。
うまい解決策はありませんでしょうか。

379 名前:デフォルトの名無しさん :2006/11/11(土) 05:47:04
>>378
greater<A*> を専用の比較関数で置きかえれ。

380 名前:デフォルトの名無しさん :2006/11/11(土) 06:56:53
>>361
http://www.boost.org/libs/iterator/doc/iterator_facade.html#tutorial-example

381 名前:デフォルトの名無しさん :2006/11/11(土) 09:26:35
class 内の関数のアドレスを取る事が出来ないのはなぜでしょうか。

class CTest {
public:
void func(){ };
}

int main() {
CTest t;
cout << &(t.func) << endl; // エラー
cout << (CTest::func) << endl; // 問題ないが、必ず値が1となる
}

382 名前:デフォルトの名無しさん :2006/11/11(土) 09:31:04
cout << &(CTest::func) << endl; // 問題ないが、必ず値が1となる

アンドが抜けてました失礼。

383 名前:デフォルトの名無しさん :2006/11/11(土) 10:10:56
static void func()アドレスをとるようになってるから。

384 名前:デフォルトの名無しさん :2006/11/11(土) 11:07:10
相談です。

VC2005EEにてビルドしたらこのようなエラー構文が出ました。
対処方法を教えてください。
※○○はわしの名前

c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2653: '  MessageBox' : 識別子がクラス名でも名前空間名でもありません。
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2664: 'void System::Windows::Forms::Form::Show(System::Windows::Forms::IWin32Window ^)' :
1 番目の引数を 'System::String ^' から 'System::Windows::Forms::IWin32Window ^' に変換できません。

385 名前:デフォルトの名無しさん :2006/11/11(土) 11:33:30
全 角 空 白

編集⇒詳細⇒スペースの表示

386 名前:デフォルトの名無しさん :2006/11/11(土) 12:01:04
iteratorって使い方は解るのですが、自分の作るクラスに
定義する場合どのように定義すればよいのでしょうか?

387 名前:デフォルトの名無しさん :2006/11/11(土) 12:05:23
>>382
&(CTest::func) じゃなくて &CTest::func じゃないと駄目らしいぜ。 (5.3.1 -3-)

388 名前:デフォルトの名無しさん :2006/11/11(土) 12:07:28
>>382
アンドって書くと条件式の論理関になるから、記号の&単体はアンパサンドと表記するのが正しかったような

389 名前:デフォルトの名無しさん :2006/11/11(土) 12:08:20
>>386
規格の 24.1 にある要件を満たすような型として定義する。
わりと面倒なんだけど boost の iterator ライブラリを使うと楽が出来る。 >>380

390 名前:デフォルトの名無しさん :2006/11/11(土) 12:30:27
>>381
ストリームに対するoperator<<に void (CTest::func*)() を取るものがないので
暗黙の型変換でboolのやつが呼ばれてるんだろ。

391 名前:デフォルトの名無しさん :2006/11/11(土) 14:16:12
>>213
うまい事言うね

392 名前:デフォルトの名無しさん :2006/11/11(土) 14:26:31
>>357
DLLで解決。

393 名前:デフォルトの名無しさん :2006/11/11(土) 14:54:13
>>385
どうもすいません
それしたあと、再度ビルドしたんですがまた同じエラー構文が出ました。

c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2653: '  MessageBox' : 識別子がクラス名でも名前空間名でもありません。
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2664: 'void System::Windows::Forms::Form::Show(System::Windows::Forms::IWin32Window ^)' :
1 番目の引数を 'System::String ^' から 'System::Windows::Forms::IWin32Window ^' に変換できません。(新しい機能 ; ヘルプを参照)
使用可能なユーザー定義された変換演算子がない、または
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

394 名前:デフォルトの名無しさん :2006/11/11(土) 14:56:19
>>393
表示設定を変えただけなんだから、その後にソース見て修正しないと駄目に決まってるだろ。

395 名前:デフォルトの名無しさん :2006/11/11(土) 14:57:39
>>393
全角スペースを半角スペースにしろ!

396 名前:デフォルトの名無しさん :2006/11/11(土) 15:00:40
>>393
同じエラーなら貼らんでいい。総じて、脳みそが足りてないんじゃないか?

397 名前:デフォルトの名無しさん :2006/11/11(土) 15:09:03
いや、構文見たらちゃんと半角スペースなってますよぉ

398 名前:デフォルトの名無しさん :2006/11/11(土) 15:10:44
なってないからエラーが出てるんだ

399 名前:デフォルトの名無しさん :2006/11/11(土) 15:12:09
98行目をもう一回書きなおせ
もう来るな 氏ねカス

400 名前:デフォルトの名無しさん :2006/11/11(土) 15:17:41
MessageBox::Show(textBox1->Text + "さん、こんにちは。");

この構文です。
どう見ても半角ですよぉ・・・
「さん、こんにちは。」は全角ですけど本に沿ってんですよぉ・・・

401 名前:デフォルトの名無しさん :2006/11/11(土) 15:19:20
全 角 「空 白」
     ~~~~~~~~~~

空 白


空 白


空 白

ほんとに >> 385 をやったのか?



402 名前:デフォルトの名無しさん :2006/11/11(土) 15:21:42
やりましたよぉ・・・
そうしたらソースコードのところに→マークがいっぱいでます
これをどうすんです・・・

403 名前:デフォルトの名無しさん :2006/11/11(土) 15:21:53
>>400
"さん、こんにちは。"を試しに"xxx"でやってみたら通る?

404 名前:デフォルトの名無しさん :2006/11/11(土) 15:23:50
ダメです・・・

405 名前:デフォルトの名無しさん :2006/11/11(土) 15:24:21
「わし」とか「よぉ・・・」とかキモ過ぎ。おまけにバカときた。消えてくれ。

406 名前:デフォルトの名無しさん :2006/11/11(土) 15:25:04
いやいい加減に出来とかんといかんのですよ
頼みますよマジで

407 名前:デフォルトの名無しさん :2006/11/11(土) 15:25:24
もういいや。MessageBox の前に全角スペースがあるだろ。それを半角スペースに直せ。
いっそその行消してもっかい全部書き直せ。

408 名前:デフォルトの名無しさん :2006/11/11(土) 15:25:39
答えが見つからないととりあえず質問者を叩く、と。

409 名前:デフォルトの名無しさん :2006/11/11(土) 15:29:41
>>404
じゃあ

MessageBox::Show("xxx");

では?

410 名前:デフォルトの名無しさん :2006/11/11(土) 15:32:52
どうやら出来たようです。
みんなありがとございましたぁ・・

411 名前:デフォルトの名無しさん :2006/11/11(土) 15:33:21
>>410
できれば原因も教えて欲しい

412 名前:デフォルトの名無しさん :2006/11/11(土) 15:35:31
>>407指摘のMessageBOXの前の空白が全角だったのが原因でした・・・ぁ

413 名前:デフォルトの名無しさん :2006/11/11(土) 15:35:49
4時間も前から正解でてたのにな・・・

414 名前:デフォルトの名無しさん :2006/11/11(土) 15:36:55
>>412
氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね
もうくんなもうくんなもうくんなもうくんなもうくんなもうくんなもうくんなもうくんな

415 名前:デフォルトの名無しさん :2006/11/11(土) 15:37:07
>>412
ドンマイです(;^^;)

416 名前:デフォルトの名無しさん :2006/11/11(土) 15:37:23
とほほ・・・ほ

417 名前:デフォルトの名無しさん :2006/11/11(土) 15:38:30
322 名前:デフォルトの名無しさん[sage] 投稿日:2006/11/11(土) 11:08:59
相談です。


VC++2005EEにてビルドしたらこのようなエラー構文が出ました。
対処方法を教えてください。
※○○はわしの名前

c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2653: '  MessageBox' : 識別子がクラス名でも名前空間名でもありません。
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2664: 'void System::Windows::Forms::Form::Show(System::Windows::Forms::IWin32Window ^)' :
1 番目の引数を 'System::String ^' から 'System::Windows::Forms::IWin32Window ^' に変換できません。

323 名前:デフォルトの名無しさん[sage] 投稿日:2006/11/11(土) 11:20:55
>>322
全角スペースを半角に置換する

325 名前:デフォルトの名無しさん[sage] 投稿日:2006/11/11(土) 11:25:34
すいません、なるべく煽らんで下さい


418 名前:デフォルトの名無しさん :2006/11/11(土) 15:39:47
>>417
おもしろいです。このスレにいて本当に良かったと思える一日でした

419 名前:デフォルトの名無しさん :2006/11/11(土) 15:44:15
俺じゃねえ

420 名前:デフォルトの名無しさん :2006/11/11(土) 17:33:48
エラー読めないヤツって生きてる価値ないよね。

421 名前:デフォルトの名無しさん :2006/11/11(土) 17:52:02
「教えられたことを咀嚼する気は全然無いですが、わかるまで教えてください」
って言ってるようなもんだからな。

422 名前:デフォルトの名無しさん :2006/11/11(土) 18:04:10
まるで朝鮮人のような奴だな。

423 名前:デフォルトの名無しさん :2006/11/11(土) 20:57:16
こんなのが職場に居たらやってられんな

424 名前:デフォルトの名無しさん :2006/11/11(土) 20:59:17
質問してくれるだけいい
質問にすら来ないでわからないことをほったらかしにするやつのほうがやばい

425 名前:デフォルトの名無しさん :2006/11/11(土) 21:00:35
五十歩百歩だと思うが。

426 名前:デフォルトの名無しさん :2006/11/11(土) 21:10:03
どっちが五十歩でどっちが百歩だ?

427 名前:デフォルトの名無しさん :2006/11/11(土) 21:15:01
そんなことはどっちでもよいからこそ五十歩百歩と言うのだ。

428 名前:デフォルトの名無しさん :2006/11/11(土) 21:22:53
それでは曖昧性があります。
コンパイルエラーです。

429 名前:427 :2006/11/11(土) 21:23:26
i|!| |i┏┓! i!┏┳┓| |||i|!i| ||!i|| |||ii| ||| ||| |i||!|i│i!┏┓i!|
|i|┏┛┗━╋┻┛|i!||!|ii|| i|!i||i|┏━┓ ┏┓i|i| i┃┃i!|
i||┗┓┏┓┃||i┏━━━━┓┗━┛ ┃┃|i||!i┃┃i!|
|i |!|i┃┃┃┃i||┗━━━━┛|i|| || ||||!┃┃i|i| i┗┛!i|
i||i ||┃┃┃┃|! |||i ||i    !|||!|┏━━┛┃|i||!i┏┓i|!
|i!i |!┗┛┗┛i|!i|  / |   / | ┗━━━┛i|i| i┗┛i!|
i| |||i|!i| ||!|i||i!   /,_ ┴─/ ヽ      |!i| ||| |i||!|i|i|||| ||i
|i|| ||i!i||     (_゜.,》.'(_゜,》)ミ ヽ       ! | |!i||!|ii||!|ii|
i|ii        / ,,__,ニ、、 ノ( |           i|i!|i|
|i        | Y~~/~y} `, ~ |  そ、そんなー…   |i
!.          | ,k.,.,!,.,.,r| ,!  く             |
i        / <ニニニ'ノ    \               l


430 名前:デフォルトの名無しさん :2006/11/11(土) 21:24:26
くだらないAA張ってうけるとでも思ってるのか

431 名前:デフォルトの名無しさん :2006/11/11(土) 21:25:15
初盆(´・ω・`)

432 名前:デフォルトの名無しさん :2006/11/11(土) 21:33:26
さっきのコンパイルエラー出て助けてくれってやつLinux板にも
マ板にも書き込んでるんだな

433 名前:デフォルトの名無しさん :2006/11/11(土) 21:37:41
これか
http://pc8.2ch.net/test/read.cgi/prog/1159668078/451

434 名前:デフォルトの名無しさん :2006/11/11(土) 21:57:25
親切な奴多いよな
いちいちバカに答えてるの。
(軽蔑の意味じゃなくて)普通にすばらしいと思う

435 名前:デフォルトの名無しさん :2006/11/11(土) 22:17:04
なぜかム板は律儀でもあるけど、ネタに対して攻撃的な反応が多いのが(´・ω・`)
ところで
> System::Windows::Forms:: ってC#じゃないの C++/CLIとか?

436 名前:デフォルトの名無しさん :2006/11/11(土) 22:20:06
^演算子(GC管理のリソースを指すポインタ)が使われているから
C++/CLIだろう。

それにC#だったらSystem.Windows.Formsって書くし

437 名前:デフォルトの名無しさん :2006/11/11(土) 22:25:41
そか、サンクス .net触ったことないからわからんかった

438 名前:デフォルトの名無しさん :2006/11/12(日) 10:54:36
>>435
プログラマってのは偏屈でプライドが高いから
答えてやってるっていう意識が強いんだろう。
まぁ本来それが正しい姿勢だと思うがね

439 名前:デフォルトの名無しさん :2006/11/12(日) 11:10:08
C++で引数に参照渡しを行う場合って
呼び出し元の変数を弄るとき以外に場合はある?

440 名前:デフォルトの名無しさん :2006/11/12(日) 11:12:01
コピーさせずに関数に引き渡す場合とか。
constくっつけて変更防止させたりして。

441 名前:デフォルトの名無しさん :2006/11/12(日) 11:37:38
string はだいたい、const string& として渡してるな
計測はしてないから、どの程度効果があるか分からんが

442 名前:デフォルトの名無しさん :2006/11/12(日) 11:41:40
>>439
コピーコンストラクタとかの処理が重たいクラスは、
積極的に参照渡しにしたほうがよさげ。


443 名前:デフォルトの名無しさん :2006/11/12(日) 11:46:15
>>439
俺は呼び出し側で引数を弄りたい場合はポインタ、
弄らなくてもいいけどコピーさせたくない場合はconst参照にしてる。

444 名前:デフォルトの名無しさん :2006/11/12(日) 15:08:55
弄りたい場合も参照渡ししてる。
NULL渡す場合があるならポインタ。

445 名前:デフォルトの名無しさん :2006/11/12(日) 16:21:12
関数が投げる例外を指定する下の例のようなthrowは
void func() throw();
宣言だけに付ければいいのでしょうか?
それとも実装の方にも付けなければいけないのでしょうか?

446 名前:デフォルトの名無しさん :2006/11/12(日) 16:29:37
>>445
それって「私は例外投げませんよ」って指定じゃなかった?

447 名前:デフォルトの名無しさん :2006/11/12(日) 16:38:41
>>446
そんなことは分かったうえでの質問だろう。たぶん。

448 名前:デフォルトの名無しさん :2006/11/12(日) 17:22:25
それはわかってます。
お尋ねしたいのは、それを宣言に付けさえすれば良いのか、定義の方にも
付けねばならないのかということです。

449 名前:デフォルトの名無しさん :2006/11/12(日) 17:27:37
>>447
訊く前に実験実験。

struct hoge{
void payo()throw();
};

//void hoge::payo()throw(){}
void hoge::payo(){}
//error: declaration of `void hoge::payo()' throws different exceptions

450 名前:デフォルトの名無しさん :2006/11/12(日) 17:46:56
実験しても環境依存やコンパイラのバグの可能性があるので
仕様そのものを知りたいなあと。
因みに、VC8だとそのコードが通ります。

451 名前:デフォルトの名無しさん :2006/11/12(日) 18:28:51
そういう時俺は持ってるコンパイラ全部で通してみるけど。
vcとg++とbcc。
時間があるなら標準規格読む。

452 名前:デフォルトの名無しさん :2006/11/12(日) 20:35:39
>>450
http://www.jisc.go.jp/
でX3014で検索。
PDFを開いてから例外指定で検索。


453 名前:デフォルトの名無しさん :2006/11/12(日) 22:32:40
#include <windows.h>
class Coordinate{
public:
Coordinate(void): x(coo.X) , y(coo.Y) {}
short& x;
short& y;
COORD coo;
};
class Recta{
public:
Recta(void): t(rec.top) , b(rec.bottom), l(rec.left) , r(rec.right) {}
long& t;
long& b;
long& l;
long& r;
RECT rec;
};
Coordinate C( int x , int y ){
Coordinate c;
c.x = x;
c.y = y;
return c;
}
Recta R( Coordinate c1 , Coordinate c2 ){
Recta r;
r.l = c1.x;
r.t = c1.y;
r.r = c2.x;
r.b = c2.y;
return r;
}

454 名前:続き :2006/11/12(日) 22:39:33
>>453
void main(){
Recta r = R( C( 1, 1 ) , C( 10 , 10 ) );
}


環境:VisualStudio.net 2002
やろうとしてること・・・
1. Windows組み込みのCOORDやRECTを、COORDやRECTとして使えるように維持しつつ機能を拡張する
 (サンプルなので余計なメンバ関数は省いてますが)
2. COORD.X とかを小文字のxでアクセスできるように参照変数を付ける
3. (mainでは)頂点を二つ指定して正方形を作る

上のソースを実行すると、四角形の頂点の値が滅茶苦茶な値になっています
(初期化されてない値っぽい?)
1ステップずつ実行すると、どうやらC関数で座標を作るところまではできていて
Cの戻り値でR関数を実行する時点でおかしくなっているようなのですが
どうしてそうなるのかが判りませんです・・・
どこか根本的に無理なことをしようとしてるのでしょうか

455 名前:デフォルトの名無しさん :2006/11/12(日) 22:53:08
>>454
デフォルトのコピーコンストラクタが参照の初期化に
コピー元への参照を使ってしまうから、コピー元が
破棄されることによって不正な参照が残ってしまう。

456 名前:デフォルトの名無しさん :2006/11/12(日) 22:54:17
MFCのCRectのソースでも見れ

457 名前:デフォルトの名無しさん :2006/11/13(月) 00:19:05
レスありがとうございます。
コピーコンストラクタって今まであまり意識していなかったのですが
今回、参照の指す先がおかしいということでしたので
Coordinate( const Coordinate& C )
:x(this->coo.X)
,y(this->coo.Y)
{
this->coo = C.coo;
}
というコピーコンストラクタを明記してみたら、意図していた通りに動くようになりました

458 名前:デフォルトの名無しさん :2006/11/13(月) 00:21:14
継承すればいいのに。

459 名前:デフォルトの名無しさん :2006/11/13(月) 00:51:56
MFCからですか?

460 名前:デフォルトの名無しさん :2006/11/13(月) 00:57:04
>>452
それによると例外指定は関数型の一部にならないってあるから
throw()は宣言にだけ付けときゃ良いわけですね。

461 名前:デフォルトの名無しさん :2006/11/13(月) 01:14:28
>460
でも、throw指定するのは(nothrow指定含めて)時代遅れだと
なんかで読んだ気がする。

462 名前:デフォルトの名無しさん :2006/11/13(月) 01:57:25
むむ。
nothrowだけは例外的に使うべきだと思ってきたが。(除テンプレート内)

463 名前:デフォルトの名無しさん :2006/11/13(月) 02:17:43
nothrowとthrow()は無関係かと・・・・。
nothrowは時代遅れ。

464 名前:デフォルトの名無しさん :2006/11/13(月) 05:00:50
>>461-462
多分GotW
Exceptinal C++ Styleでもかかれてる
>>463
文脈嫁

465 名前:デフォルトの名無しさん :2006/11/13(月) 05:17:08
>>457
>2. COORD.X とかを小文字のxでアクセスできるように参照変数を付ける
これをする理由がわからん。
参照を返すアクセサを用意するだけでいいような希ガス。

466 名前:デフォルトの名無しさん :2006/11/14(火) 09:48:58
>>459
COORD, RECTから

467 名前:デフォルトの名無しさん :2006/11/14(火) 18:51:04
nothrowとかthrowは、constみたいにコンパイル時に禁止できる訳じゃなくて、
try { hoge() }
catch(Hoge){throw;}
catch( ... ){ unexpected(); }
みたいなコードを自動生成するだけだら、使えネーって話だな。

468 名前:デフォルトの名無しさん :2006/11/15(水) 02:36:58
nothrow と throw() をごっちゃにするなよ。

throw() は呼び出し側の最適化に役に立つ。

nothrow については、ググッたところ、
http://www.nothrow.com/

469 名前:デフォルトの名無しさん :2006/11/15(水) 08:06:32
Boostによればthrow()は全然最適化に役立ってないらしいがなw

470 名前:デフォルトの名無しさん :2006/11/15(水) 18:32:47
結局thorw()を付けるのと付けないのとでは、どっちがいいんだ?
俺は今まで、デストラクタには必ず付けていたが。

471 名前:デフォルトの名無しさん :2006/11/15(水) 18:45:12
>>470
つけなくていいんじゃない?
Boostも例外指定はしないで決定してるみたいだし

472 名前:デフォルトの名無しさん :2006/11/15(水) 21:10:08
Binary Hacksになんかこの手のが書いてあったな。

473 名前:デフォルトの名無しさん :2006/11/16(木) 09:34:27
Herb Sutter は More Exceptional C++ Item 19 で
「throw() を付けるかどうかは好みの問題だけど、
 個人的には /* throw() */ とコメントで書いておくのが好き」
と言ってるな


474 名前:デフォルトの名無しさん :2006/11/16(木) 10:57:47
#if defined(ENABLE_EXCSPEC)
#define NOTHROW throw()
#endif

475 名前:デフォルトの名無しさん :2006/11/16(木) 20:12:28
テンプレート使うライブラリはthow()とか書きようがないな

476 名前:デフォルトの名無しさん :2006/11/16(木) 21:06:03
Herb Sutter は Exceptional C++ Style でも素敵なガイドラインを
書いてるね。なんとも含蓄があるよ。

教訓#1:例外仕様を決して書いてはならない。
教訓#2:空の例外仕様は除くが、私があなたなら、それさえも避けるだろう。

477 名前:デフォルトの名無しさん :2006/11/16(木) 21:09:10
>>476
ゴメン・・
含蓄kwsk

478 名前:デフォルトの名無しさん :2006/11/17(金) 10:39:58
質問なんですが、

char型、string型でもいいのですが、
文字列から特定の文字だけを全部削除できる関数はあるんでしょうか?
aaaabbbaaaabbbaaaaa

aaaaaaaaaaaaa
という風にです。

479 名前:デフォルトの名無しさん :2006/11/17(金) 10:51:20
remove_if()とerase()を組み合わせれば出来る

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>

int main()
{
std::string s = "aaaabbbaaaabbbaaaaa";
std::cout << s << std::endl;

s.erase(std::remove_if(s.begin(), s.end(), std::bind2nd(std::equal_to<char>(), 'b')), s.end());
std::cout << s << std::endl;
}

480 名前:デフォルトの名無しさん :2006/11/17(金) 10:52:46
std::bind_2nd〜の部分を別に関数オブジェクトに持てば、もっと
複雑な削除条件も簡単に書ける。

boost::bindで何としても一行で済まそうという傾向もありますが

481 名前:デフォルトの名無しさん :2006/11/17(金) 10:57:17
>>479
remove() でいいだろ。

482 名前:478 :2006/11/17(金) 10:59:03
ありがとうございました☆
解決しました

483 名前:デフォルトの名無しさん :2006/11/17(金) 11:14:02
>>481
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void main()
{
string s = "aaaabbbaaaabbbaaaaa";
remove(s.begin(), s.end(), 'b');
cout << s << endl;
}
結果:aaaaaaaaaaaabaaa
remove()だけだと削除しきれない。

484 名前:デフォルトの名無しさん :2006/11/17(金) 11:23:45
>>483
うむ。 erase() も要るな。

485 名前:デフォルトの名無しさん :2006/11/17(金) 11:25:40
>>483 void main() 氏ね

486 名前:デフォルトの名無しさん :2006/11/17(金) 13:10:35
何故。

487 名前:デフォルトの名無しさん :2006/11/17(金) 13:19:24
戻り値型がvoidのmain関数なんて規格には無い

488 名前:デフォルトの名無しさん :2006/11/17(金) 13:22:00
はいはい規格規格

489 名前:デフォルトの名無しさん :2006/11/17(金) 13:24:53
まあmainは一箇所だけ直せばいいからなw

490 名前:デフォルトの名無しさん :2006/11/17(金) 13:57:17
悪い。483です。void main()は完全なる間違いです。すみません。はい。

491 名前:デフォルトの名無しさん :2006/11/17(金) 14:59:22
と思ったら私のはちゃんとint main()になってたか・・・・void mainは別人ですた。

remove()でもいいですね。remove_if()をわざわざ使ったのは、例えば
'b'が2回現れた後は'c'も削除せよ、というような場合に便利ですね。

今回はremove()だけでいいみたいです。

492 名前:デフォルトの名無しさん :2006/11/17(金) 15:20:42
何行かの改行されたファイルを文字数を指定して、
文字列を取り出していきたいんですけど、どうしたらいいでしょうか?

493 名前:デフォルトの名無しさん :2006/11/17(金) 16:03:51
>>492
無視する文字は改行文字だけ?ホワイトスペース文字全般?

494 名前:デフォルトの名無しさん :2006/11/17(金) 16:14:11
改行だけの方法と、
ホワイトスペースも無視する方法のふたつをお願いします。

495 名前:デフォルトの名無しさん :2006/11/17(金) 17:14:22
>>494
#include <iostream>
#include <fstream>
#include <string>

int getsome(std::ifstream& fs, std::string& s, int n);
int getwows(std::ifstream& fs, std::string& s, int n);

int main()
{
std::ifstream fs("ws.txt");
std::string s;

int n = getsome(fs, s, 10); // 改行文字のみを無視
std::cout << n << "文字: \'" << s << '\'' << std::endl;

fs.seekg(0, std::ios::beg);
s = "";
n = getwows(fs, s, 10); // ホワイトスペース文字を無視
std::cout << n << "文字: \'" << s << '\'' << std::endl;
}

int getsome(std::ifstream& fs, std::string& s, int n)
{
char c;
int i = 0;

while (i < n && fs.get(c))
if (c != '\n') {
s += c;
i++;

496 名前:デフォルトの名無しさん :2006/11/17(金) 17:15:32
}

return i;
}

int getwows(std::ifstream& fs, std::string& s, int n)
{
char c;
int i = 0;

while (i < n && fs >> std::ws >> c) {
s += c;
i++;
}

return i;
}

getsome()が改行文字のみを無視、getwows()はホワイトスペース文字を
全て無視します。

497 名前:デフォルトの名無しさん :2006/11/17(金) 17:16:17
なおテストに使ったファイルの内容は
---- ws.txt ----
1234





56

78

90
[EOF]

498 名前:デフォルトの名無しさん :2006/11/17(金) 17:26:10
ありゃ
>>497には所々文字列の前に' 'とかタブ文字を入れて見て下さい。

499 名前:494 :2006/11/17(金) 17:29:05
なるほど。get()を使うんですか!
問題を解決する事ができました!
ありがとうございます!

500 名前:デフォルトの名無しさん :2006/11/17(金) 18:57:47
void main(void){return;}


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.