C++相談室 part40

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/06/29(水) 10:41:33
http://www.open-std.org/jtc1/sc22/wg21/
News 2005-06-28: C++ Standard Core Language Issues List (Revision 36) is available
953デフォルトの名無しさん:2005/06/29(水) 14:02:21
>>950
「プログラムの規模」って言いたかっただけでは?
954デフォルトの名無しさん:2005/06/29(水) 16:16:10
>>950
明確な基準はないと思うけど、
「いつ、どこで、どんな操作がされるかを把握できる」
かどうかに懸かってるんじゃなかろか。

例えばログファイルにメッセージ書くクラスがあって
それが「書き込み」という操作しかなければ
グローバルにインスタンス作ってもいいわけで。
955デフォルトの名無しさん:2005/06/29(水) 16:44:44
グローバル変数の欠点を理解してない意見も混ざってる気がする。

publicでstaticな変数との違いは、
クラス宣言に書く必要が無いからこっそり使ったりする事が可能だって事と、
大規模なプログラムの場合、名前の衝突が管理出来なかったり、
VCみたいな賢いIDEが使えない場合に型の確認が面倒だって事くらいだろう。

publicでstaticな変数にも共通する欠点は色々あるから、
それを許すかどうかもはっきりさせた方がいいわな。

どっちにしろ、「使わなくても出来るけど手抜きでやってる」って事を意識しとくべき。
956デフォルトの名無しさん:2005/06/29(水) 16:50:54
MFC使うとグローバル変数の一個大隊がついてくるからなぁ。
957デフォルトの名無しさん:2005/06/29(水) 17:48:09
グローバル変数が0で済むプログラムってのもどんだけちっちゃいんだよって思うけど。
まぁクラスにきちんとまとめて、それも全部publicとかじゃなくて丁寧にアクセス制御しとくんだろうな
958デフォルトの名無しさん:2005/06/29(水) 19:58:18
クラステンプレートの内側に、クラステンプレートの特殊化版をネスト定義できない件について。
ふぬおおおソースがきちゃなくなるんじゃあああヾ(`□´)ノ
959デフォルトの名無しさん:2005/06/29(水) 20:43:25 BE:168573964-
コンパイラが古いんジャマイカ。
VC++6.0ではネストできんかった。
VC++.NETではネストできた。
960959:2005/06/29(水) 20:43:44 BE:140478645-
.NET 2003ね。
961デフォルトの名無しさん:2005/06/29(水) 23:08:21
>>959
g++だと意図的に対応していないようであります
標準のappendixで禁止しているかららしい。
関数内関数定義とか、templateの宣言・定義の簡略化とか
C++0xで変わったらいいなあ。
962デフォルトの名無しさん:2005/06/30(木) 01:08:31
WindowsプログラミングをしようとするとWinMainとWndProcの兼ね合いとかでほとんど無理だけどな>グローバル0
963デフォルトの名無しさん:2005/06/30(木) 01:26:43 BE:295004276-
>>962
とりあえずフレームワークさえ構築してしまえば
表だったグローバル変数は使わなくて済むと思う。

まぁ俺は安易にグローバル変数使っちゃう族だが。
964デフォルトの名無しさん:2005/06/30(木) 02:04:38
いや、ウィンドウプロシージャごときで静的変数なんかつかわねーだろ普通
965デフォルトの名無しさん:2005/06/30(木) 02:10:20
>>951
結局、STLはここでいいんだよね?
966デフォルトの名無しさん:2005/06/30(木) 02:28:18
>>965
いいはずでしょ、標準の一部だし。
967デフォルトの名無しさん:2005/06/30(木) 03:17:57
このスレの1が変なのか
968デフォルトの名無しさん:2005/06/30(木) 07:30:17
STLスレを立てるやつが変。
969デフォルトの名無しさん:2005/06/30(木) 15:39:33
デバッグしてみたら
-1.#IND000000000
-1.#INF000000000
こんな数字が変数に入ってるんだけどこれは何なのでしょうか?
970デフォルトの名無しさん:2005/06/30(木) 16:24:42
>>969
数値以外の値。
前者はなんだろう。
後者は負の無限大かな?
いずれにしても、C++の問題というよりデバッガの問題だよな。
971デフォルトの名無しさん:2005/06/30(木) 16:39:51
INDって何の略ですか?
972デフォルトの名無しさん:2005/06/30(木) 16:56:01
>>969-971
前者は「不定」で恐らくは-0/0の結果。
後者は「無限大」で恐らくは-1/0の結果。
973デフォルトの名無しさん:2005/06/30(木) 17:24:04
なんかシンプルな行列やベクトルライブラリありませんか?
DirectXのD3DXVECTORぐらいでいいのですが、環境に依存しないやつほしいです。
974デフォルトの名無しさん:2005/06/30(木) 17:33:48
boostなり自分で作るなり
975デフォルトの名無しさん:2005/06/30(木) 17:44:42
976デフォルトの名無しさん:2005/06/30(木) 17:59:58
>>973
gslとかliboctaveとか
977デフォルトの名無しさん:2005/06/30(木) 18:09:53
>>971
Indeterminate
978デフォルトの名無しさん:2005/06/30(木) 18:51:49
>>974
boostのベクトルも探してる最中なんですが、
2次元3次元のベクトルよりquaternion、octonionやらが先に見つかってしまいます。
どこかな・・・。

>>975-976
ありがとうございます。
そーゆーのです。
といってもいろいろあると目移りしてしまいます・・・。
979デフォルトの名無しさん:2005/06/30(木) 19:02:32
>>978
>どこかな・・・。
ublas
980デフォルトの名無しさん:2005/07/01(金) 01:13:04
スレ違いかもしれないどうしようもない質問をしてしまうのですが
自分は今までプログラムをやった事がないものの、来週からC++をやろうとしています
ここで質問ですが、C++をやるに当たって最初に必要なものはなんでしょうか?何か買う必要があるのでしょうか?
幾ら調べても本当にわけが分かりません、コンパイラーというのが有れば出来るものなのでしょうか?ご指導をよろしくお願いいたします。。
981デフォルトの名無しさん:2005/07/01(金) 01:17:13
>>980
コンパイラーと、あとはテキストエディタが要るだろうな。
しかしここはスレ違いだ。
何か始めて、行き詰まったらまず↓こっち行け。
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
ここの過去ログやリンクを漁れば、初心者の質問は大抵カタがつく。
982デフォルトの名無しさん:2005/07/01(金) 01:20:18
>>980
どうして突然C++をやることになったのかが興味がわきますね。
とりあえず友達にプログラマを見つけて、ある程度のレベルまでは教えてもらうのが早いかと。
983デフォルトの名無しさん:2005/07/01(金) 01:24:04
>>980
Microsoft Visual C++ Toolkit 2003 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1109618655/6-12
984デフォルトの名無しさん:2005/07/01(金) 02:28:49
struct A{ int a; };

A a[10];
for( A* i = a; a != a + 10; ++a )
a->a = 10;

これをSTLの関数オブジェクトまたはboostのbindを使って置換したいのですが
どうすればいいでしょうか?
985984訂正です:2005/07/01(金) 02:29:38
struct A{ int a; };

A a[10];
for( A* i = a; i != a + 10; ++i )
a->a = 10;

これをSTLの関数オブジェクトまたはboostのbindを使って置換したいのですが
どうすればいいでしょうか?
986デフォルトの名無しさん:2005/07/01(金) 02:30:36
貼っときますね

プログラミングやってる奴がキモいです><
ttp://ex11.2ch.net/test/read.cgi/news4vip/1120152486/
987デフォルトの名無しさん:2005/07/01(金) 02:45:23
>>984-985
using namespace boost::lambda;
std::for_each(a, a + 10, bind(&A::a, _1) = 10);
988デフォルトの名無しさん:2005/07/01(金) 02:50:27
>>985
boost::bind ではなく boost::lambda::bind だけど。

#include <algorithm>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

namespace bl = boost::lambda;
std::for_each(&a[0], &a[10], bl::bind(&A::a, bl::_1) = 10);
989デフォルトの名無しさん:2005/07/01(金) 03:10:18
>>987-988
lambdaを使うんですね、ありがとうございました。
990デフォルトの名無しさん:2005/07/01(金) 05:13:32
class func : std::unary_function<int, void>
{
public:
result_type operator( ) ( argument_type i ){}
};

std::vector< int > v;
boost::bind( &std::for_each, _1, _2, _3)( v.begin(), v.end(), func());

すいません、また教えてください・・
VisualC++7.1なんですが、これのコンパイルが通りません。
error C2780が大量に出ます。さっぱりわかりません。
991デフォルトの名無しさん:2005/07/01(金) 05:44:56
&std::for_each を
&std::for_each< std::vector< int >::iterator, func > に直しましたが
まだ駄目です。
bind関数の一番目の引数である「v.begin()」に対して
「1 番目の引数を '_STL::vector<_Tp>::iterator' から '_STL::vector<_Tp>::iterator & ' に変換できません。」
「'const' に対してではない参照は 非左辺値へバインドできません。」
とでます。どういう意味でしょうか?
992デフォルトの名無しさん:2005/07/01(金) 06:24:00
煮詰まったので質問します。
型AとBが同じ型のときtrueを、異なる型のときfalseを返すクラステンプレート:
template <typename lhs, typename rhs>
struct is_equal {
 tempalte <typename T> struct proxy { enum { type = false }; };
 template <> struct proxy<rhs> { enum { type = true }; };
 enum { type = proxy<lhs>::type };
};
は、explicit specialization in non-namespace scopeエラーとなりコンパイルできません。
そこで、proxyクラステンプレートをnamespaceスコープで特殊化することになりますが
この書き方がサッパリわかりません。
外側のクラステンプレートは特殊化せず、内側だけを特殊化したいのです。
コンパイラはgcc-3.3.3です。

>>990
それはbind使う意味があるんでしょうか?
993デフォルトの名無しさん:2005/07/01(金) 06:34:31
>>991
bind内部では参照がメインだからです。
boost::bind( &std::for_each<std::vector<int>::iterator&, func>, _1, _2, _3)( v.begin(), v.end(), func());
これでいいと思うよ。
994デフォルトの名無しさん:2005/07/01(金) 08:04:40
>>993
やってみて駄目だったんですが、
一時オブジェクトは非const参照には変換出来ないとわかりまして
以下のようにしたら通りました。
勉強になりました、ありがとうございました。

std::vector< int > v;
std::vector< int >::iterator b= v.begin();
std::vector< int >::iterator e= v.end();
boost::bind( &std::for_each< std::vector< int >::iterator, func >, _1, _2, _3)( b, e, func());

>>992
for( iterator i = v.begin(); i != v.end(); ++i){
for( iterator j = i->w.begin(); j != i->w.end(); ++j){
func( *j );}}
これを関数オブジェクトで書けないかと検討中だったんです。

しかし、bindやlambdaというのは使い道が見えません。
普通に直で関数オブジェクト書いちゃった方が楽な気がする・・
995デフォルトの名無しさん:2005/07/01(金) 09:23:58
996デフォルトの名無しさん:2005/07/01(金) 10:59:36
@string型をint型にキャストするにはどーすればいいんですか??
 StrToIntとかToIntという関数があるようですが,
 これでは駄目なようで困っています.
Aファイルから1行を切り出すにはどうすればいいんですか??
 40文字ずつ改行しながら別のファイルに出力させていくという
 プログラムを作りたいのですが,
   char *c;
   fileReader.get(c, number, '\n');
 のようにしてnumberが21くらいになるとメモリがreadにならないという
 エラーメッセージが出てきます.どうしてでしょうか??
997デフォルトの名無しさん:2005/07/01(金) 11:21:46
>>996
inline int stoi(const string& str) { return atoi(str.c_str()); };
関数名から予想するとBCBのようだけど、
AnsiString == String != std::string (!= CString)
なので注意ナ

「一行」切り出すのは、finをテキストモードで開いて
string str;
getline(fin, str);
40文字ずつ改行するならsubstrかカウンタ使う
漏れならperl使う
998デフォルトの名無しさん:2005/07/01(金) 11:41:15
>>992
>型AとBが同じ型のときtrueを、異なる型のときfalseを返すクラステンプレート
これだけが必要なら別に外側だけ特殊化すればよいような気がします.

>外側のクラステンプレートは特殊化せず、内側だけを特殊化したいのです。
これは言語規格的に無理です.
999デフォルトの名無しさん:2005/07/01(金) 12:29:57
999
1000デフォルトの名無しさん:2005/07/01(金) 12:30:09
ギリギリまで真面目に話してるおまえらにもえ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。