C++相談室 part41
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/07/01(金) 13:09:21ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ part40
http://pc8.2ch.net/test/read.cgi/tech/1113408957/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0002デフォルトの名無しさん
2005/07/01(金) 13:11:030003デフォルトの名無しさん
2005/07/01(金) 13:11:442 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0004デフォルトの名無しさん
2005/07/01(金) 13:12:2717 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
0005デフォルトの名無しさん
2005/07/01(金) 13:13:1832 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
0006デフォルトの名無しさん
2005/07/01(金) 13:14:16[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21
[C/C++ Users Journal]
http://www.cuj.com/
[cppll (ML)]
http://www.trickpalace.net/cppll/ (日本語)
0007デフォルトの名無しさん
2005/07/01(金) 13:41:51amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0008デフォルトの名無しさん
2005/07/01(金) 14:02:54Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0009デフォルトの名無しさん
2005/07/01(金) 14:05:50[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[STL]
STLport http://www.stlport.org/
SGI-STL http://www.sgi.com/tech/stl/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://www.moderncppdesign.com/
LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0010デフォルトの名無しさん
2005/07/01(金) 14:10:19[他]
ACE http://www.cs.wustl.edu/~schmidt/
Blitz++ http://www.oonumerics.org/blitz/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
http://www.trumphurst.com/cpplibs/cpplibs.phtml
(日本語) http://www.kmonos.net/alang/cpp/lib.html
0011デフォルトの名無しさん
2005/07/01(金) 14:13:31【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/
C/C++の宿題を片付けます 46代目
http://pc8.2ch.net/test/read.cgi/tech/1119514274/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc5.2ch.net/test/read.cgi/tech/1095442366/
0012デフォルトの名無しさん
2005/07/01(金) 14:16:520013デフォルトの名無しさん
2005/07/01(金) 14:35:27俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0014デフォルトの名無しさん
2005/07/01(金) 14:39:230015デフォルトの名無しさん
2005/07/01(金) 14:42:01とかいうエラーが出るんだけどこれってどうすればいいの?
0016デフォルトの名無しさん
2005/07/01(金) 14:54:28後氏ね。
0017デフォルトの名無しさん
2005/07/01(金) 14:57:05まぁヒントぐらいにはなったな。
うむごくろう。
00181
2005/07/01(金) 15:00:10http://pc8.2ch.net/test/read.cgi/tech/1113408957/21
>21 名前:デフォルトの名無しさん[sage] 投稿日:2005/04/14(木) 03:47:02
>>>1
>実は part41 にしないといけなかったのかもしれない。
>ttp://pc8.2ch.net/test/read.cgi/tech/1106527792/41-42
ごめん、見落としてたor2
0019デフォルトの名無しさん
2005/07/01(金) 15:11:36乙
0020デフォルトの名無しさん
2005/07/01(金) 15:17:010021デフォルトの名無しさん
2005/07/01(金) 15:27:21std::copy(penis.begin(), penis.end(), std:back_inserter(vulva));
複数の男のチンポを受け入れる女のマンコ(;´Д`)ハァハァ
0022デフォルトの名無しさん
2005/07/01(金) 16:19:22VisualC++7.1ではそのまま通りました。
0023前スレ>>992
2005/07/01(金) 16:51:31template <typename lhs, typename rhs>
struct is_equal {
enum { type = false };
};
template <typename T>
struct is_equal<T, T> {
enum { type = true };
};
レスしてくださった人ありがとうございました。
0024デフォルトの名無しさん
2005/07/01(金) 16:58:09enumにしなくてもstatic const boolでいいだろうに。
0025前スレ951
2005/07/01(金) 21:43:47次スレは「C++相談室 part43」です。
~~
0026デフォルトの名無しさん
2005/07/01(金) 22:26:550027デフォルトの名無しさん
2005/07/01(金) 22:47:06find() がそれに相当するんじゃまいか?
002826
2005/07/01(金) 22:59:23いや、そうじゃなくて要素がないときに例外を投げるようなものがないということ。
それにatやout_of_rangeという名前がmapとは多少肌が合わなくても他のコンテナに合わせるということはないのかと思った。
0029デフォルトの名無しさん
2005/07/01(金) 23:53:23文字型を整数型に変換するにはどうしたらいいでしょうか?
atoiは文字列じゃないと使えないようなのですが。
0030デフォルトの名無しさん
2005/07/01(金) 23:58:04map に at ?
要素が無ければ out_of_range ?
多少とかじゃなくて、激しくキモイよ。
0031デフォルトの名無しさん
2005/07/01(金) 23:58:05char c = '9';
とかなら
int n = c - '0';
がらくだな。
0032デフォルトの名無しさん
2005/07/01(金) 23:58:44operator[]があるぐらいならat()があってもイイんじゃないの
ってことジャマイカ
0034デフォルトの名無しさん
2005/07/02(土) 00:11:020035デフォルトの名無しさん
2005/07/02(土) 00:12:42意味がわかりませんが
c = getchar();
c = getchar();
と書いても何も問題はありませんよ?
0037デフォルトの名無しさん
2005/07/02(土) 09:50:14教科書より文字コード表見た方がいいと思うぞ
0038デフォルトの名無しさん
2005/07/02(土) 12:01:56C++標準関数ではないし、一文字だけ入力したいということがない。
>>35のように連続して使うなら、それは文字列として扱った方がいい悪寒:
std::string str;
std::cin >> str;
おっと、こうするとstrに4TBとか入れられてプログラムが落ちるから
C++は危険なんだっけ!
0039デフォルトの名無しさん
2005/07/02(土) 12:06:17getcharは<cstdio>のC++標準の関数だけど。
0040デフォルトの名無しさん
2005/07/02(土) 12:30:05> おっと、こうするとstrに4TBとか入れられてプログラムが落ちるから
どんなに大きな入力がきても、
str.max_size() まで読み出すか、
最悪 bad_alloc が飛んでくるだけだよ。
それで困るんなら setw(100) とか挟んどけ。
0041デフォルトの名無しさん
2005/07/02(土) 12:48:52C標準ライブラリは、参照によって提供されているだけで、
C++標準ライブラリの一部ではないんじゃなかったっけ違ったっけ。
嘘言ってそう、あとで調べ直す(ρ_;)
>>40
スマンちょっとすねてみただけだ・・・
0042デフォルトの名無しさん
2005/07/02(土) 17:53:54getchar()やgetc()みたいなものを使って
一文字入力する場合stdioとiostreamでは話にならないレベルの速度差が
あったけどな。
stdioのが10倍程度速かった。ただしマルチスレッドでない場合だが。
0043デフォルトの名無しさん
2005/07/02(土) 23:10:310044デフォルトの名無しさん
2005/07/02(土) 23:13:210045デフォルトの名無しさん
2005/07/02(土) 23:14:55#include <vector>
std::vector<bool> sieve_of_eratosthenes(int upper) {
std::vector<bool> integers(upper + 1, true);
integers[0] = integers[1] = false;
for (int i = 2; i <= upper / 2; ++i) {
int notprime = i;
while ((notprime += i) <= upper) integers[notprime] = false;
}
return integers;
}
bool is_prime(int n){return sieve_of_eratosthenes(n)[n];}
0046デフォルトの名無しさん
2005/07/03(日) 03:10:10いまあるデータの一群を対象に特定の操作(ファイルへの書き込みや読み出しなど)したいとします。
そこでそのデータの集まりをCDataというクラスにします。
今後のメンテナンスを考えるとデータメンバを追加するときに集成するのはこのクラスだけにしたいです。
さらにread/writeというメソッドを追加しファイルへの読み書きができるようにします。
しかし、このCDataのあるインスタンスだけが、read/writeを使えるようにしたいです。
(つまりコードのいたるところで好き勝手にwriteされると言うことを防ぎたい。)
さらにそのread/writeができるインスタンスはデータを読み込んだら他のCDataクラスのインスタンスに
メンバをバイナリコピーしたいとします。つまり、
CDataRW foo1; //こいつはread/writeできる。
CData foo2;
foo1.read();
foo2 = foo1;
foo2.read(); //←ダメ。コンパイルエラーが望ましい
foo1 = foo2;
としたい分けです。よいクラス設計やデザインパターンなどありますでしょうか?
0047デフォルトの名無しさん
2005/07/03(日) 03:17:14(2) Rだけ出来るクラス
(3)どっちも出来ないクラス
の3つが作りたいって事か?
0048デフォルトの名無しさん
2005/07/03(日) 06:05:45つーか、>>47ならCData→CDataR→CDataRWでそれぞれread()とwrite()か。
0049デフォルトの名無しさん
2005/07/03(日) 06:42:48そうですよね。結局そういう方法で作りこんでます。
何を嫌がっていたかと言うと、CDataで変数を追加するとCDataRWのread/writeにも同様に修正が必要なことです。
でもそれしかないかなぁ。
最初考えたのがCDataにread/writeを実装して、CDataRWはpublicに派生、CDataNoRWクラスはprotected派生
とやってみたんだけど、それだと
CDataRW foo1;
CDataNoRW foo2;
foo2 = foo1;がダメだったです。コピーコンストラクタを書くと、結局CDataが持っている全メンバの知識が必要になるし。
0050デフォルトの名無しさん
2005/07/03(日) 07:03:18protected:
void read_impl() {}
};
CDataRW: public CData {
public:
void read() { CData::read_impl(); }
};
みたいなのは駄目?
あと、コピーコンストラクタは
全メンバを知らなくても
内部でthis->CData::operator =(*other)みたいにすることも出来るけど。
0051デフォルトの名無しさん
2005/07/03(日) 07:04:59最低でもなにもしないwrite()とread()があるとして
template<typename T>
class CDataOpen {
T & impl;
bool writable;
public:
CDataOpen(const T& d,bool b=false) : impl(d) ,writable(b){}
size_t operator()(){return b ? impl.write() : impl.read();}
};
func(){
CDataOpen<CDataRW> Write(fool,true);
CDataOpen<CDataR> Read(fool);
CDataOpen<CDataRW> Read2(fool2);
while(...){
...処理内で使いまわす
Read2();
Read();
Write();
}
}
0052デフォルトの名無しさん
2005/07/03(日) 07:47:58>this->CData::operator =(*other)
こういうコピーもありましたか。
const CDataRW & CDataRW ::operator=(const CData & o)
{
this->CData::operator=(o)
return *this;
}
って感じでしょうか?
ちなみにprotectedで派生させたCDataNoRWがあるとした場合、
CDataRW drw;
CDataNoRW dnrw;
drw = dnrw; //コピー
dnrw = drw; //逆のコピー
だとすると
const CDataRW & CDataRW ::operator=(const CDataNoRW & o)
const CDataNoRW & CDataNoRW ::operator=(const CDataRW & o)
が居るのでしょうか?
const CDataRW & CDataRW ::operator=(const CDataNoRW & o)
{
this->CData::operator=(o)
return *this;
}
としてみたところ、
error C2243: '型キャスト' : 'const CDataNoRW *__w64 ' から 'const CData &' の変換は存在しますが、アクセスできません。
となってしまいました。CDataNoRWをいったんCDataにしたいですね。。ポインタだったらdynamic_castが通用するのかも知れないな。。
と言うわけで、このパラダイムをC++の世界ではどう扱うのかに興味が移ってきました。
(製造は簡単な>>48さんの方式を取りたいと思います。)
0053デフォルトの名無しさん
2005/07/03(日) 08:37:59つまり引数側(代入式の右辺側)が派生クラスということでしょ?
だったらそれこそ何もしなければ代入できると思うけど。
もちろん、データメンバを追加していた場合には
スライシングの問題が起きるけどね。
(逆に、Base::operator =() を利用する時は、追加したメンバを初期化する必要がある)
0054デフォルトの名無しさん
2005/07/03(日) 08:43:01いや、こうだろ。
CData
↓ ↓
CDataR CDataW
↓ ↓
CDataRW
005552
2005/07/03(日) 09:41:480057デフォルトの名無しさん
2005/07/03(日) 15:32:12諸事情でC++使えるようになりたいんです。
毎日勉強したら何日くらいでマスター出来ますか?
個人差あるのはわかってますけど、だいたいの目安を教えてください。
0058デフォルトの名無しさん
2005/07/03(日) 15:39:010059デフォルトの名無しさん
2005/07/03(日) 15:39:10そんな無意味な質問をすることから推測するに、一年くらいやれば
糞設計のメモリリークしまくりオブジェクト指向とは無縁の糞コードを量産できるようになります。
0060デフォルトの名無しさん
2005/07/03(日) 15:59:41ビルドしたところ、以下のメッセージが出てしまいました。
error LNK2001: 外部シンボル ""char * __cdecl fgets(char *,int,struct _iobuf *)" (?fgets@@$$J0YAPADPADHPAU_iobuf@@@Z)" は未解決です。
該当するソースはこのようになっています。
FILE *fstream;// ファイルディスクリプタ
char tLine[256];// 一行読み込み用
if( fgets( tLine, 128, fstream ) == NULL ){
if( ferror( fstream ) ){// 一行読み出しエラー
break;
}
break;// EOFに達した
}
その他,atoi、strstrなど、Cランタイムライブラリ関数(?)関連のものは
みな外部シンボルが未解決と出るんですが…何か参照設定が足りないのでしょうか?
ご教授いただければ思います。
0061デフォルトの名無しさん
2005/07/03(日) 16:11:12http://pc8.2ch.net/test/read.cgi/tech/1118781438/
ちょっと前までスレのテンプレに書くコンパイラ専用スレ集として
「コンパイラスレ」があったとおもうんだが、なんで無くなったんだ?
0062デフォルトの名無しさん
2005/07/03(日) 16:20:13スレチガ失礼しました。誘導ありがとうございます。
0063デフォルトの名無しさん
2005/07/03(日) 17:01:100064デフォルトの名無しさん
2005/07/03(日) 17:07:32int main(int argc, char* argv[])とすればargvに入る。
詳細はググれ。
0065デフォルトの名無しさん
2005/07/03(日) 18:53:23>char tLine[256];// 一行読み込み用
>if( fgets( tLine, 128, fstream ) == NULL ){
これはひどいな。
0066デフォルトの名無しさん
2005/07/03(日) 19:45:21なら書くな
0067デフォルトの名無しさん
2005/07/03(日) 23:56:01#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
for (int i (0); i < argc; ++ i)
cout << argv [i] << endl;
return 0;
}
0068デフォルトの名無しさん
2005/07/04(月) 01:31:24struct structA{ ... }strA
class classB{ ... }
classB *objectC = (strA*)
0069デフォルトの名無しさん
2005/07/04(月) 01:50:030070デフォルトの名無しさん
2005/07/04(月) 03:03:10目を覆いたくなるコードだな…
バッファが256なのに128読み込み
それにfstreamはstd::fstreamと混同しそうで怖いな
漏れはCはサッパリだが、Cだとbreakつかいまくりなの?
>>68
structAでoperator classB()とかをオーバーロードしてあるのかな
0071デフォルトの名無しさん
2005/07/04(月) 03:42:58breakつかってもif文から脱出できるわけではないから、あれは
外側にループがあるんだろう
>>68
「適当」じゃなくて「ちゃんと」書けよ
classB *objectC = &strA;
の間違いか?
0072デフォルトの名無しさん
2005/07/04(月) 11:44:38「コンパイルエラー」
0073デフォルトの名無しさん
2005/07/04(月) 14:14:02それはVC++の質問じゃなくて
標準C++固有の質問なんでしょうか。
0074デフォルトの名無しさん
2005/07/04(月) 16:23:09むしろC++ですらなく、Cの質問の悪寒。
void f(ifstream& fin) {
string line;
while (getline(fin, line)) {
// ...
}
};
0075デフォルトの名無しさん
2005/07/04(月) 16:56:20同じclass Interfaceを基底クラスに持つ、class Fooとclass Baaがあり、
クライアント側はInterface型のリストとしてFooとBaaを所持すると言う、ありがちな関係があります。
さて、FooとBaaのデータを、ファイルに保存する必要があります。
人に読んでもらう事が前提のフォーマットです。
ここではたと迷ってしまいました。
Baa BaaDataA BaaDataB ...
Foo FooDataA FooDataB ...
Baa BaaDataA BaaDataA ...
といった感じの、先頭にタイプIDみたいのがあるフォーマットならば
いかにもオブジェクト指向っぽく扱えて楽なので、これで行こうと思っていました。
ところが世間のファイルフォーマットを観ると
Foo
FooDataA FooDataB ...
Baa
BaaDataA BaaDataB ...
BaaDataA BaaDataB ...
こんな風に、FooならFooでまとめて記述しているフォーマットが多く
確かに見た目はこちらの方がスマートですし、データ量も少なく、ベストな気がします。
ところが後者を実装するとなると、Interface型のリストしか無い以上
小細工が必要になり、あまり嬉しくありません。
どちらが良いか、なんでもいいのでアドバイス頂けると幸いです。
0076デフォルトの名無しさん
2005/07/04(月) 17:11:26["Foo"]と["Baa"]について順次書き出す
読むときはまとまっていた方が嬉しいが、Interafceの生成順は保持しなくてもいいの?
007775
2005/07/04(月) 17:22:05さすがに1行では無理なのですが(例が悪くて申し訳ないス)、
なるほどmapを使ってstringの代わりにオブジェクト自体を持たせれば…
おかげでスマートな実装が見えてきました
> 読むときはまとまっていた方が嬉しいが
にも後押しされました。ありがとうございました。
0078デフォルトの名無しさん
2005/07/04(月) 18:26:50stringの代わりにオブジェクト自体、はあんまりかも。ポリモフィズムの意味が薄れるから。
class Interfaceに純粋仮想関数 serialize() を用意し、
その返値を pair<string, string>とかにして、各派生クラスで:
pair<string, string> serialize() {
string str = ...;
return make_pair("Foo", str); // strは"FooDataA FooDataB ..."
};
template <typename T, typename S>
void serialize(T first, T last, S& container) {
while (first != last) {
pair<string, string> data = (*first++)->serialize();
container[data.first].push_back(data.second);
}
};
vector<Interface*> interfaces;
map<string, vector<string> > serial_map;
serialize(interfaces.begin(), interfaces.end(), serial_map);
もっといい書き方がありそう
0079デフォルトの名無しさん
2005/07/04(月) 19:46:16うっかり、multimapにpair<string, Interface*>を持たせてソートし
Interfaceに持たせたsaveData()=0を一気に使わせるようなのを考えてました。
お手本ありがとうございます。書き方も含め勉強になります。
0080デフォルトの名無しさん
2005/07/04(月) 20:53:48の例では断然上を取るがな、俺は。
下の良さってのは、領域が節約できることだけだ。
上の例はgrepやawkのようなツールでも扱いやすいし、
セーブやロードも単純化できる。
008176,78
2005/07/05(火) 13:41:51もしwindowsでいえばコマンドプロンプトのアイコンを見たことがあるユーザを対象にするなら
Foo FooDataA FooDataB...
形式を選んだ方がいいかもしれない。
出力をソートすればidごとにまとまるし、grepで必要なidのだけ見れる。
ログを「加工」する部分は外部ツールですべきだとも思う。
でも、各種ツールを使うスキルを要求するのは難しいし(というより不可能)
ログがそのまま人間にとって読みやすくないと見てすらもらえない(ρ_;)
だから、
Foo:
\tFoo1:
\t\tFooData1A FooData1B
\t\tFooData1C FooData1D
\tFoo2:
\t\tFooData2A FooData2B
Baa:
\tBaa1:
とか、見やすく、プログラムからも扱えるような形式のがいいかなと。
xmlではき出せばいいのかな。そこまでするものなのかな。
0082デフォルトの名無しさん
2005/07/06(水) 15:37:58// 省略
}
class C2 {
template <class T>
void F(T t = C1());
}
template <class T>
void C2::F(T t) {
// 省略
}
というコードで、
C2 c2;
c2.F(C1());
だと問題なくコンパイルされるんですが、
C2 c2;
c2.F();
だと「could not deduce template argument for 'C1'」というエラーが出ました。
デフォルト引数でテンプレートを推論する事はできないのでしょうか?
0083デフォルトの名無しさん
2005/07/06(水) 15:54:33コンパイラの立場で質問。
c2.F();と書いた場合に、
引き数のない関数の呼び出しとディフォルト引き数つきの関数の呼び出しの区別はどうすればいい?
0085デフォルトの名無しさん
2005/07/06(水) 20:32:29区別のしようがないからエラーにしていいんじゃなかったっけ?
0086デフォルトの名無しさん
2005/07/06(水) 22:26:410087デフォルトの名無しさん
2005/07/07(木) 01:01:0714.8.2.4 -17-
"A template type-parameter cannot be deduced from the type of a function default argument."
ttp://www.kuzbass.ru/docs/isocpp/template.html#temp.deduct.type
0088デフォルトの名無しさん
2005/07/07(木) 01:03:31これならさすがに通るな。
俺もメンバテンプレートをいまいち理解できてねーな。
008982
2005/07/07(木) 10:02:13オーバーロードを解決するのに関数の実体化が必要だけど、デフォルト引数の評価はこの時点ではできないため、
テンプレート引数が不明で関数の実体化ができない、みたいな感じなんでしょうか。
>>87
デフォルト引数では無理ですか。
皆様ありがとうございました。
0090デフォルトの名無しさん
2005/07/07(木) 10:49:52まぁ、デフォルト引き数は何かと問題になるから引き数の違いでコンストラクタを複数作るほうが無難だね。
しかも、>82の例だとそれがデフォルトコンストラクタになるのだから尚更。
#逆に、デフォルトコンストラクタを作りたくないとなると話は別だが。
0091デフォルトの名無しさん
2005/07/08(金) 13:48:03今リストの勉強してるので気になります。
0092デフォルトの名無しさん
2005/07/08(金) 15:01:28public:
CPOINT(int x, int y) : x_(x), y_(y) {}
int x_, y_;
};
struct SPOINT {
int x_, y_;
};
void F1(CPOINT cp) {
...
}
void F2(SPOINT sp) {
...
}
CPOINT cp(0, 0); // OK
SPOINT sp = {0, 0}; // OK
F1(CPOINT(0,0)); // OK
F2(SPOINT(0,0)); // エラー
F2(SPOINT({0,0})); // エラー
F2(SPOINT() = {0,0}); // エラー
F2(SPOINT{0,0}); // エラー
F2({0,0}); // エラー
コンストラクタが定義されていないと、
初期化した一時オブジェクトを作ることができないのでしょうか?
SPOINT sp = {0, 0};
これがOKなだけに、なんか納得できない・・・。
0093デフォルトの名無しさん
2005/07/08(金) 16:53:39当たり前じゃん・・・・
それから、
SPOINT sp = {0, 0};
これはC++とは関係なく、Cでも出来る、構造体の初期化にすぎない。
0094デフォルトの名無しさん
2005/07/08(金) 17:09:420095デフォルトの名無しさん
2005/07/08(金) 18:04:360096デフォルトの名無しさん
2005/07/09(土) 00:28:38class CPOINT
{
int x_, y_;
};
F1(CPOINT(0,0));
↑これも通らないと納得いかないのか?
初心者の「納得行かない」はただ単に理解してないだけだよな
0097デフォルトの名無しさん
2005/07/09(土) 00:35:41意味がわからない。
「安定的」でないほうが自然な関数を例に挙げてもらえるとわかるかも。
0098デフォルトの名無しさん
2005/07/09(土) 02:11:34二次元配列(4x4)に、変数を含む値を代入しようとしています。
{X,0,0,0},{0,X,0,0},{0,0,X,0},{0,0,0,X}
のような形です。ここで、Xは宣言の段階では決定していないので、
Xが決定した後に値を代入したい と思っています。
宣言時以外の時に、まとめて代入はできないのでしょうか?
初心者丸出しですが、どなたか教えてください・・・・
0099デフォルトの名無しさん
2005/07/09(土) 02:16:08二次元配列を二つ用意し、一つは
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1,
で初期化しておく。
その後Xが確定したときにもう一つの方に
for (int i = 0; ...) {for (int j = 0; ...) {theArray[i][j] = X * fixedArray[i][j];}}
とでもしてコピーすればいい。
#つーか、std::copy()か。
0100デフォルトの名無しさん
2005/07/09(土) 02:21:11for (int i = 0; i < 4; ++i)
a[i][i] = X;
でいいだろ
0101デフォルトの名無しさん
2005/07/09(土) 03:18:33{} は初期化の構文なので定義のときしか使えない。
C99でC言語に導入されたコンパウンドリテラルなら {} を使った値を「代入」で使える。
でもこれは標準C++には無い機能だ。
おとなしく要素ごとに代入するコードを書いてしまうのがいいよ。
■ このスレッドは過去ログ倉庫に格納されています