【C++】template 統合スレ -- STL/Boost/Loki, etc.
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG以下のスレッドを統合するスレです。
STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/test/read.cgi/tech/1026793823/
【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
関連スレ、その他リンクは >>2-5 あたりに。
0583デフォルトの名無しさん
NGNG標準C++の次期規格が固まる時まで無理だと思ふ。
0584デフォルトの名無しさん
NGNGそうなったらstdのコンテナは使わないって意味?
0585デフォルトの名無しさん
NGNG>>582は完全にネタだろ。
0586デフォルトの名無しさん
NGNGLoki::RefCountedMTだけテンプレートパラメータの数が違う気がするんですが、
これでいいんですか?
gccだとコンパイル通りませんが。
int main(void){
Loki::SmartPtr<int, Loki::RefCountedMT> p;
return 0;
}
過去ログ一応見ましたが、がいしゅつだったらご免なさい。
0587デフォルトの名無しさん
NGNG(文法レベルで)ちょっとわからない事があったのですが、
コンストラクタの引数の
template<typename Y>
weak_ptr(weak_ptr<Y> const & r)
という書き方、これは一体何を表しているのでしょうか?
生のポインタなら Y* const はわかるのですが、それって対応するのは
weak_ptr<const Y> ですよね?
ポインタ自体が const なら const weak_ptr<Y> ですよね?
weak_ptr<Y> const& っていうのは何を表しているんでしょうか?
0588デフォルトの名無しさん
NGNGconst AAA &
と
AAA const &
は同じ意味。
0590デフォルトの名無しさん
NGNG↓こんな話があった。
http://pc3.2ch.net/test/read.cgi/tech/1002252975/594-626
0591587
NGNGVC++6.0 で boost::mem_fn を自作スマートポインタに適用しようとしたら
C:\Program Files\Microsoft Visual Studio\VC98\include\xmemory(34) : error C2660: 'new' : 関数が不正な 2 個の実引数をともなって呼び出されました。
C:\Program Files\Microsoft Visual Studio\VC98\include\xmemory(66) : コンパイルされたクラスのテンプレートのインスタンス化 'void __cdecl std::_Construct(MyPtr<PointeeType> *,const MyPtr<PointeeType> &)' の参照を確認してください
みたいなエラーになりました。何がいけないか以上の情報でわかる人いますか?
ちなみに同じ状況で自作スマートポインタを boost::shared_ptr に変えると
コンパイル通るのです。
>>590
激しく鬱ですね…。ポインタが全て Ptr<PointeeType> みたいな書式になって
配列を int[] num; みたいに書ければ const が全て直後の型に掛かる。で統一できるのに…。
0592デフォルトの名無しさん
NGNGboost::mem_fn 側ではnewもstd::allocatorも一つも使っていないようだが…。
そのエラーは他の場所が原因に見える。あと、mem_fn を使うには
namespace boost {
template<typename T> T* get_pointer( const T& p ) { return &*p; }
}
が必要だが、書いてる?
>>589
boost coding guildline。らしい。
http://groups.yahoo.com/group/boost/files/coding_guidelines.html#decl_initialization
0593デフォルトの名無しさん
NGNG0594デフォルトの名無しさん
NGNGで、プログラム内でのそのテンプレートの使い方が限られているなら
明示的インスタンス生成ですな。
0595デフォルトの名無しさん
NGNGそのガイドラインの評価ってどうなってんの?
0596デフォルトの名無しさん
NGNGそこでSTLのsetとmultisetを使おうと思って以下のように書いたんですが、
ソースのいたるところでif(cyofukuOK)の分岐だらけになってしまってます。
もっといい方法ないでしょうか?
set<AnsiString> setContainer
multiset<AnsiString> multiContainer
//以下略
if(cyofukuOK)
multiContainer.insert(tmp);
else
setContainer.insert(tmp);
0597デフォルトの名無しさん
NGNGmultisetを操作するラッパーを作ればいいんじゃねーの?
0598デフォルトの名無しさん
NGNGstd::set, std::multiset を直にコードに埋めずに、
1) std::set を保持し、それを操作するクラス。
2) std::multiset を保持し、それを操作するクラス。
と二つに分けてしまう。
Set* pSet;
if (cyofukuOK)
pMap = new MultiSet();
else
pMap = new UniqueSet();
struct Set {
virtual void insert(AnsiString) = 0;
...
};
class UniqueSet : public Set {
std::set<AnsiString> container_;
public:
void insert(AnsiString s) { container_.insert(s); }
};
class MultiSet : public Set {
std::set<AnsiString> container_;
public:
void insert(AnsiString s) { container_.insert(s); }
};
0599デフォルトの名無しさん
NGNG598さん、ありがとうございます。
早速やってみました。
コンテナに保持するまではうまくいったのですが、
iteratorはどうやって保持すればいいんでしょうか?
以下のようにすると特化パラメータを指定しろというエラーメッセージが出るのですが、よくわかりません。
forで使うのでbegin(),end()も必要なんでしょうかね?やはり・・
struct mySet {
virtual void insert(AnsiString) = 0;
virtual iterator getiterator(void) = 0;
};
class UniqueSet : public mySet {
std::set<AnsiString> container_;
std::set<AnsiString>::iterator itrator_;
public:
void insert(AnsiString s) { container_.insert(s); }
iterator getiterator(void) { return itrator_; }
};
class MultiSet : public mySet {
std::multiset<AnsiString> container_;
std::multiset<AnsiString>::iterator itrator_;
public:
void insert(AnsiString s) { container_.insert(s); }
iterator getiterator(void) { return itrator_; }
};
0600デフォルトの名無しさん
NGNGちなみに現状はこんな感じです。
typedef set<AnsiString> SetContainer;
typedef SetContainer::iterator SetIterator;
SetContainer Container
;
if (cyofukuOK)
{
for(SetIterator it=Container.begin();it!=Container.end();++it)
TRichEdit1->Lines->Add(*it);
{
else
{
以下略
}
0601591
NGNG>>592
か、書いてませんでした。下記のような感じのオーバーロードでいいのでしょうか?
namespace boost
{
template <typename T>
T* get_pointer(const MyNamespace::MyPtr<T>& smartPtr)
{
return &(*smartPtr);
}
}
ちなみにこれを書いてもエラーメッセージは何も変わりませんでした。
よろしくお願いします。
0602デフォルトの名無しさん
NGNG> 以下のようにすると特化パラメータを指定しろというエラーメッセージが出るのですが、
そりゃ
> iterator getiterator(void) { return itrator_; }
ここの戻り値の型である iterator ってのが、テンプレート型だからでしょ。クラス定義
の中に
typedef std::set<AnsiString>::iterator iterator;
とでも追加しとかんと。
0603デフォルトの名無しさん
NGNGvector<T> vec; が格納している要素列の先頭アドレスを得るのに
&vec[0] とやると思うんだけど、この操作は、vec.empty() == true
の時も有効でしょうか。
0604デフォルトの名無しさん
NGNG0605デフォルトの名無しさん
NGNG&vec[0] に「書き込む」のはダメだが、&vec[0] を取得するのは問題ないと思うぞ。
0606デフォルトの名無しさん
NGNGあなたひどいひとね。
0607デフォルトの名無しさん
NGNGその式の値をどう使うつもりだ?
0608605
NGNG0609デフォルトの名無しさん
NGNGイテレータ同士の比較とか、C 関数に渡す場合には使えるよね。
/* 要素数 num の int 配列を処理する */
extern "C" void foo(int *data, size_t num);
vector<int> v;
..
foo(&vec[0], vec.size());
0610デフォルトの名無しさん
NGNG解決しました。
思いっきり勘違いしてました。最終的に以下のようになりました。
ありがとうございました。
//.h
struct mySet {
virtual void insert(AnsiString&) = 0;
virtual unsigned int getSize(void) = 0;
typedef std::set<AnsiString>::iterator iterator;
virtual iterator begin(void) = 0;
virtual iterator end(void) = 0;
};
//.cpp
auto_ptr<mySet> pSet;
if(RepeatDataCheckBox->Checked)//重複なし
{
auto_ptr<UniqueSet> instance (new UniqueSet());
pSet = instance;
}
else //重複あり
{
auto_ptr<MultiSet> instance (new MultiSet());
pSet = instance;
}
pSet->insert(tmp);
typedef std::set<AnsiString>::iterator iterator;
for(iterator it = pSet->begin();it!=pSet->end();++it)
{
ed->Lines->Add(*it);
}
0611デフォルトの名無しさん
NGNGv.empty()のとき、v.begin()は"past-the-end"っていう値を返すことになってる(23.1 -7-)。
イテレーターiについて、*iが定義されるようなiの値を、"dereferencable"っていう
けど、"past-the-end"は"dereferencable"じゃぁない(24.1 -5-)。
ってことで、v.empty()のとき、v[0]は
"dereferencable"ではないイテレーターに operator * を適用することになるので、
未定義である。
あとから & つけたところで手遅れだと思われ。
0612605
NGNGコンテナ a の operator[](int n) は *(a.begin() + n) と定義されているから、n = 0 のときに
*a.begin() (== *a.end()) が許されるか否かが問題。
a.end() は常に past-the-end-value (有効な要素の『次』を指す) イテレータを返し、これ
は
> 24.1 Iterator requirements
> 6. (前略) Values of an iterator i for which the expression *i is defined are called
> dereferenceable. The library never assumes that past-the-end values are
> dereferenceable
ということでデリファレンスしてはいけない。つまり *a.begin() という表記は NG で、
従って &a[0] も NG ってことになる。
ただし、現実には参照はコンパイラ内部ではポインタとして実装されてるから
vector<int> v;
int& n = &v[0];
int* p = &n;
とした場合でも p (n のアドレス) だけ見てる分には問題ない。ただし *p = 1 とか
int x = *p といったように、n の値を読み書きすると、一般保護違反で落ちたりメモリ
壊したりする。
……ってことかね。
0613605
NGNG0614デフォルトの名無しさん
NGNGその場合、mySetのデストラクタにvirtualが要る。
MultiSetの実装が謎だ。なんでコンパイルとおるんだ?
絶対解決してないと思うんだが?
0615デフォルトの名無しさん
NGNGvector<T>::iterator が T* という良くある環境だと問題ないけど、STLport の
デバッグモードみたいに別の型が返ってくる(それをデリファレンスすると T
になる)だと、怒られそうな気がする。
とはいえ微妙に使いにくい仕様だな、これ。>>609 にあるような C 言語の関
数を呼ぶ場合、どうせ C 関数の方で要素数チェックして 0 なら何もしない、
ってのが普通だし、そっちにチェックを任せたいよな。
0616611
NGNG0617デフォルトの名無しさん
NGNGこのようにしましたけど、問題ないようです。
環境はBCB5でWindowsXPです。
//重複なしのコンテナ
class UniqueSet : public mySet {
std::set<AnsiString> container_;
std::set<AnsiString>::iterator itrator_;
public:
void insert(AnsiString& s) { container_.insert(s); }
unsigned int getSize(void){ return container_.size(); }
iterator begin(void){ return container_.begin(); }
iterator end(void){ return container_.end(); }
};
//重複ありのコンテナ
class MultiSet : public mySet {
std::multiset<AnsiString> container_;
std::multiset<AnsiString>::iterator itrator_;
public:
void insert(AnsiString& s) { container_.insert(s); }
unsigned int getSize(void){ return container_.size(); }
iterator begin(void){ return container_.begin(); }
iterator end(void){ return container_.end(); }
};
0618デフォルトの名無しさん
NGNGgccでも↑のコードがエラーにならん。
仕様じゃ、ないよな?
0619デフォルトの名無しさん
NGNGsize()==0よりもempty()を使えって話になるんじゃないか?
0620デフォルトの名無しさん
NGNGそれでも
extern "C" void foo(int *data, size_t num);
に対して、これを利用する C++ 側関数は
vector<int> v;
if (!v.empty())
foo(&v[0], v.size());
と場合分けが必要になるよね。
0621デフォルトの名無しさん
NGNG↓で問題ないと思う。
inline
void foo( vector<int>& v )
{
  if(!v.empty())
    foo(&v[0],v.size());
}
0622デフォルトの名無しさん
NGNG俺だったらこんな関数作って使うかな。
templat<class T>
inline T* GetFirstPointer( vector<T>& v )
{
if(v.empty())
return NULL;
else
return &v[0];
}
で、vectorが空でも&v[0]が許される実装で、
かつ効率が気になる場合は
単純に&v[0]を返すように書き換えると。
0623622
NGNG誤:templat<class T>
正:template<class T>
0624デフォルトの名無しさん
NGNG>621のコードを見てなお、>622のコードを使いたくなるのって、どんなとき?
0625デフォルトの名無しさん
NGNG0626デフォルトの名無しさん
NGNGラッパ関数を沢山書くのが面倒な場合だろう。
0628622
NGNGあとfooが関数オブジェクトだった時や、
fooがvectorのサイズを変更しないことを示したい時にも
>622の方を使いたくなるな。
0629デフォルトの名無しさん
NGNGということは、末端のコードにGetFirstPointerがばら撒かれるわけか。
  foo(GetFirstPointer(v),v.size());
・・・うーん、あんまり賛成できないなぁ。
0631デフォルトの名無しさん
NGNGいっそ vector 継承して operator[] だけ再定義したオブジェクトを作るのも
手かもしれんな。
メンバ変数は一切増えないから、デストラクタが virtual でなくとも支障ない
しさ。
0633デフォルトの名無しさん
NGNGでもさ、vector::operator[] って reference を返すじゃん。
てことは、&v[0] は dereference を実行してないと思うんだけど。
まあでも、v.size() == 0 の場合、要素配列を格納するための
有効なバッファがが確保されているかどうかは不明だしねぇ。
やっぱり v.empty() で切り分けるしかないかなぁ。
0634デフォルトの名無しさん
NGNG> でもさ、vector::operator[] って reference を返すじゃん。
で、規格書読むと reference は「有効なオブジェクトを指さねばならない」と書いてあったり
するわけだ。
> てことは、&v[0] は dereference を実行してないと思うんだけど。
これは &(*v.begin()) と同じ意味なんだが、v.begin() が返すのが単なるポインタではない
場合には、実際に dereference が行われた上で、そのアドレスが計算されることになる。
たいていの処理系だと vector<T>::iterator は T* だから問題ないけど。
0635601
NGNGやはり別の理由でした。自作スマートポインタが、変な形式の operator new を持っていたのがいけなかったようです。
(g++ に切り替えてわかったのですが、boost::mem_fn ではなくて、その前のコンテナに突っ込むところでのエラーだったようです。)
それを取り除いて、自作ポインタ用の get_pointer を追加した所、うまくいきました。
ありがとうございました。
0636635
NGNGget_pointer は koenig look-up があるので 名前空間 boost に入れなくても
よさそうです。
0638デフォルトの名無しさん
NGNG最近になってテンプレート化してみたら、同じ型同士は問題なく動くけど
違う型を混ぜると下のように怒られちゃいました。
型をあわせなきゃいけないみたいだけどどうすればいいのでしょう……
borland c++ 5.5でつ
vec3<double> a
vec3< complex<double> > b,c
c=a*b;
『エラー E2094 : * 演算子が使われたがクラス Vec3<complex<double >> では Vec3<double> 型のための定義が存在しない』
0639デフォルトの名無しさん
NGNG実行されると期待しているんだ?
0640デフォルトの名無しさん
NGNG本質的には T から U への型変換が存在する時に、vec<T> から vec<U> への
型変換を認めたい、って話だよね。
それなら、テンプレート化したコピーコンストラクタを作る。vec3 の実装がどうなっ
てるか知らんけど、かりに vec3<T> が private 変数として T 型の配列 v_[3] を
持つと仮定すると、
template <typename T>
class vec3
{
public:
template <typeename U>
vec3(const vec3<U>& other)
: v_(other.v_)
{}
};
ってな感じ。other.v_ (U[3]型) から v_ (T[3] 型) への暗黙の型変換がある場合、
これでよろしく変換できる。
0641デフォルトの名無しさん
NGNG配列だと余分なアクセス入るかなと思って、ベクトルの各成分はT v[3]じゃなくてT x,y,zで実装してます。
もっと次数が高ければ当然配列にするだろうけど……あ、配列だったらSTLのvector使えばいいのか。
明日試してみます
0642デフォルトの名無しさん
NGNGいいのでしょうか?
コンパイルできるのですがワーニングが出ます。gcc3.2.1(MinGW)です。
template <typename T>
class A {
T value;
public:
A(double d = 0) {
value = d;
}
friend std::ostream& operator<<(std::ostream& os, const A<T>& a);
};
std::ostream& operator<<(std::ostream& os, const A<double>& a)
{
os << a.value;
return os;
}
int main()
{
A<double> a(1.23);
std::cout << a << std::endl;
}
0643デフォルトの名無しさん
NGNGなんでそのコンパイラの出力をはぶきやがるんだ?
0644デフォルトの名無しさん
NGNGすみません、ワーニングをコピペします。
g++.exe "C:\MinGW\Learn\Learn2\template_ostream.cpp" -o "C:\MinGW\Learn\Learn2\template_ostream.exe" -Wall -s -O3 -I"C:\mingw\include" -I"C:\mingw\include\c++" -I"C:\mingw\include" -L"C:\mingw\lib"
C:/MinGW/Learn/Learn2/template_ostream.cpp:10: warning: friend declaration `
std::ostream& operator<<(std::ostream&, const A<T>&)' declares a
non-template function
C:/MinGW/Learn/Learn2/template_ostream.cpp:10: warning: (if this is not what
you intended, make sure the function template has already been declared and
add <> after the function name here) -Wno-non-template-friend disables this
warning
Execution terminated
Compilation successful
0645デフォルトの名無しさん
NGNGFriend declaration `std::ostream& operator<<(std::ostream&, const A<T>&)'
declares a non-template function.
If this is not what you intended, make sure the function template has
already been declared and add <> after the function name here.
-Wno-non-template-friend disables this warning.
・・・ってなワケだ。あとは好きなように対処しな。
0646デフォルトの名無しさん
NGNG次のようにしたらコンパイル通りました。ありがとうございました。
ちなみにBCC5.6では通りませんね。
template <typename T>
class A {
T value;
public:
A(double d = 0) {
value = d;
}
friend std::ostream& operator<< <>(std::ostream& os, const A<T>& a);
};
template <typename T>
std::ostream& operator<<(std::ostream& os, const A<T>& a)
{
os << a.value;
return os;
}
int main()
{
A<double> a(1.23);
std::cout << a << std::endl;
}
0648638
NGNG無事complex<double> とdouble間の計算が出来ますた。有難う
0649デフォルトの名無しさん
NGNGどうすればいいでしょう。つまりログとりたいんです
template<typename T>
class Hoge {
public:
Hoge() {
Log::debug("Hoge<T>::Hoge()");
}
};
Hoge<int> hoge;
で Hoge<int>::Hoge() と表示してほしいんですが・・・
0650デフォルトの名無しさん
NGNGtypeid(T).name()
0651デフォルトの名無しさん
NGNGtypeid(T).name()
0653デフォルトの名無しさん
NGNGコンパイル時に Hoge<int>::Hoge になって欲しいんです・・・
0654デフォルトの名無しさん
NGNG無理。
std::string でも使え。
0655デフォルトの名無しさん
NGNGあきらめます・・・
"<" と ">" に挟まれた文字列を検索して格納したいのですが。
これで良いでしょうか?
{
std::string text;
std::string __text;
std::string::iterator i_first;
std::string::iterator i_last;
i_first = __text.begin() + __text.find( "<", 0 ) + 1;
i_last = __text.begin() + __text.find( ">", 0 );
text.assign( i_first, i_last );
}
0657デフォルトの名無しさん
NGNG例えばこんなのはどうか。
std::string text;
std::string __text;
std::string::iterator i_first;
std::string::size_type st;
i_first = __text.begin() + __text.find("<") + 1;
st = __text.find(">") - __text.find("<") - 1;
text.assign(i_first, st);
0658デフォルトの名無しさん
NGNGstd::stringはイテレータよりもインデックスで扱った方が
扱いやすいようだ。
std::string text;
std::string __text("aaa<abc>def");
std::string::size_type st, st2;
st = __text.find("<") + 1;
st2 = __text.find(">") - __text.find("<") - 1;
text = __text.substr(st, st2);
0659デフォルトの名無しさん
NGNG0660デフォルトの名無しさん
NGNGエラーチェックしてないから。したらしたなりになる。
0661デフォルトの名無しさん
NGNGboost::regex使えばいいのに。
0662656
NGNGとりあえず抽出だけを考えてます
それで、関数を作ってみました。
const std::string Extraction
(
const std::string text,
const std::string text_open,
const std::string text_close
)
{
std::string output = "";
std::string::size_type position_open = 0;
std::string::size_type position_close = 0;
std::string::size_type position_target = 0;
position_open = text.find( text_open, 0 );
if( position_open == std::string::npos ) return ( const std::string )"";
position_close = text.find( text_close, position_open );
if( position_close == std::string::npos ) return ( const std::string )"";
position_target = position_open + text_open.length();
output.assign( text, position_target, position_close - position_target );
return ( const std::string )output;
}
0663656
NGNGstd::string t;
t = Extraction( "a<b<c<d", "<", ">" ); // 無
t = Extraction( "a<b<c>d", "<", ">" ); // b<c
t = Extraction( "a<b>c<d", "<", ">" ); // b
t = Extraction( "a<b>c>d", "<", ">" ); // b
t = Extraction( "a>b<c<d", "<", ">" ); // 無
t = Extraction( "a>b<c>d", "<", ">" ); // c
t = Extraction( "a>b>c<d", "<", ">" ); // 無
t = Extraction( "a>b>c>d", "<", ">" ); // 無
STL 初心者なもので、色々と不具合があるかもしれません。
みなさんどうもありがとうございました
0664デフォルトの名無しさん
NGNGこれではいかぬか
const std::string Extraction
(const std::string& text, const std::string& text_open, const std::string& text_close)
{
std::string::size_type position_open = text.find(text_open), position_close, position_target;
if (
position_open == std::string::npos
|| (position_close = text.find(text_close, position_open)) == std::string::npos
|| (position_target = position_open + text_open.length()) > position_close
)
return std::string();
else
return std::string(text, position_target, position_close - position_target);
}
0665デフォルトの名無しさん
NGNGスマートポインタ同士の直接代入はできるけど、
スマートポインタから生ポインタを取り出して、それを別のスマートポインタに入れると参照カウントの二重管理になって悲惨な結末になるんですよね。
んで、普段は可能な限りスマートポインタを使うことでどうにかなるんですけど、
一ヶ所だけ絶対にスマートポインタが使えないところがあって、
つまり this ポインタなんですけどね。
boost::shared_ptr< MyType > MyType::GetObject( std::string name )
{
return boost::shared_ptr< MyType >( this->name==name ? this : new MyType( name ) );
}
みたいな必要があったとき、皆さんならどうしますか?
私はもうぜんぜん思いつかないんで進入型に切り替えるしかないかなぁとか思ってますが。
0666デフォルトの名無しさん
NGNG0667デフォルトの名無しさん
NGNG0668デフォルトの名無しさん
NGNGhash_map ではなくて、ハッシュ値を計算する hash の方? 使った事はあるけど。
0669デフォルトの名無しさん
NGNGhashのアルゴリズムは処理系依存なんですよね。
どういう仕組みで発生しているのか興味があります。
0670デフォルトの名無しさん
NGNG> hashのアルゴリズムは処理系依存なんですよね。
STLport の hash の話をしてるなら、処理系非依存だが。stl/_hash_fun.h に
書いてあるから読んでみ。
ちなみにテンプレートクラスとして定義されているので、ユーザ定義クラスに対する
ハッシュ値は、自分で specialization しないと計算できない。
0671デフォルトの名無しさん
NGNGinline size_t __stl_hash_string(const char* __s)
{
_STLP_FIX_LITERAL_BUG(__s)
unsigned long __h = 0;
for ( ; *__s; ++__s)
__h = 5*__h + *__s;
return size_t(__h);
}
これでしょうか。割と簡単な事してるんですね。ありがとうございました。
0672デフォルトの名無しさん
NGNG無理かなあ?
isEnumとisMemberFuncPointerは出来たので送ったら反映されたん
だけど誰かアイデアない?
http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0673デフォルトの名無しさん
NGNG改行を表示してくれません。どこを直せば良いでしょうか。
int main()
{
std::ifstream ifs("copy1.cpp");
std::copy(std::istream_iterator<char>(ifs), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout));
}
0674デフォルトの名無しさん
NGNGstd::istream_iterator<type>(i)は、i >> t を内部で実行しているため、
ホワイトスペース文字はスキップされて読み込まれない。
0675デフォルトの名無しさん
NGNGありがとうございます♪
意外でした。std::getlineか何かで読み込んでみることにします。
0676デフォルトの名無しさん
NGNGstd::noskipwsをストリームに食わせてやれば、ホワイトスペース
文字も読み込める。
int main()
{
std::ifstream ifs("copy1.cpp");
ifs >> std::noskipws;
std::copy(std::istream_iterator<char>(ifs), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout));
}
0677デフォルトの名無しさん
NGNG何か、「食わせてる」 って気がしないよな。
0678デフォルトの名無しさん
NGNG0679デフォルトの名無しさん
NGNGtemplate< typename T, size_t N >
inline size_t length_of( T(&)[N] ) throw(){ return N; }
それを参考にした、静的配列の最後の要素を得るコード
template< typename T, size_t N >
inline T& last_element_of( T(&array)[N] ) throw()
{
return array[N-1];
}
0680デフォルトの名無しさん
NGNGint main()
{
std::ifstream ifs("copy1.cpp");
std::copy(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>(), std::ostream_iterator<char>(std::cout));
}
0681デフォルトの名無しさん
NGNG0682デフォルトの名無しさん
NGNGちなみに某所ってどこよ?他にもお宝眠ってたりせんかの?
■ このスレッドは過去ログ倉庫に格納されています