C++相談室 part45
レス数が1000を超えています。これ以上書き込みはできません。
0001(*^ー゚)b グッジョブ!!
2005/11/26(土) 21:20:04ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1128512737/
0951VC++スレから飛んできました
2006/01/07(土) 10:07:19別の型にしておけばいいじゃん、と思って
typedef double millisecond;
typedef double microsecond;
typedef double second;
ってやったけど、
millisecond x = 0.1;
microsecond y = 0.2;
second z = 0.3;
としても x=y; y=z; z=x; とかなんの警告も出ないのね。
やっぱそれぞれクラスを作らなきゃだめ?
0952デフォルトの名無しさん
2006/01/07(土) 10:33:190953デフォルトの名無しさん
2006/01/07(土) 10:45:000954デフォルトの名無しさん
2006/01/07(土) 10:49:490955デフォルトの名無しさん
2006/01/07(土) 10:50:57boost/strong_typedef.hpp 見てみた。
結局主要な演算子を定義した構造体を作ってるだけだった。
#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(double,strong_millisecond);
BOOST_STRONG_TYPEDEF(double,strong_microsecond);
BOOST_STRONG_TYPEDEF(double,strong_second);
とすると、
strong_millisecond x = strong_millisecond(0.1);
double d = (double)x;
と明示的に変換しないといけなくなる。
うはwww、これでポカミスしないですみそうだ。
正規表現ライブラリくらいしか boost つかってなかったけど、
また一つ boost の恩恵に浴することができた。
0956デフォルトの名無しさん
2006/01/07(土) 10:58:430957デフォルトの名無しさん
2006/01/07(土) 11:08:15速度/時間 * 時間 == 速度 とか、数値と物理単位を同時にあつかうような例があったと思う。
0958デフォルトの名無しさん
2006/01/07(土) 11:17:070959デフォルトの名無しさん
2006/01/07(土) 14:39:33五右衛門も忘れないでね。
0960デフォルトの名無しさん
2006/01/07(土) 17:09:390961デフォルトの名無しさん
2006/01/07(土) 17:12:420962デフォルトの名無しさん
2006/01/07(土) 19:28:270963デフォルトの名無しさん
2006/01/07(土) 19:32:37型の意味を付けるはずだった、と言う話を思い出した。
inchAvgDistance += mmDist[0];
で間違いが直ぐ判るとかなんとか。
0964デフォルトの名無しさん
2006/01/07(土) 19:51:040965343
2006/01/07(土) 22:21:08としてCLASSES(Hoge)を
class Hoge; class HogeFactory;
と展開させられないでしょうか
お願いします
0966965
2006/01/07(土) 22:25:310967デフォルトの名無しさん
2006/01/07(土) 22:39:340968デフォルトの名無しさん
2006/01/07(土) 22:41:15って、2ch だと勝手に入っちゃうんだったっけ?
それはそうと、開区間、閉区間、片開区間を表現する
標準的なクラスって用意されていましたっけ??
0969965
2006/01/07(土) 23:19:47お早いレスありがとうございます。
おかげさまで、いろいろやりたかったことができそうです。
0970デフォルトの名無しさん
2006/01/08(日) 00:03:00標準にはないけどboostになら
Boost Interval Arithmetic Library
http://www.boost.org/libs/numeric/interval/doc/interval.htm
0971デフォルトの名無しさん
2006/01/08(日) 00:05:46俺もそんなことをやったことがあったが、
結局後でテンプレート使えば言いやということに気付いて#defineには引っ込んでもらった。
0972デフォルトの名無しさん
2006/01/08(日) 00:08:02Boost って本当に何でもあるよな。
えらい人たちが標準化も視野に入れてやってるんだから
大丈夫だとは思うけど、なんでもいれちゃえ、って
感じじゃないんだろうか・・・
0973デフォルトの名無しさん
2006/01/08(日) 00:11:02Boostに収録されるまでにも過程があって、
認められないとBoostには収録されない仕組みになっている。
0974デフォルトの名無しさん
2006/01/08(日) 00:22:45記述する方法ってありませんか?
2次元配列に対して処理を行う関数を複数作りたいと思っています。
例えば以下の関数sumは配列の合計を出す関数です。(変数宣言などは省略)
int sum(){
(前処理)
for(r = 0; r < nRow; r++){
for(c = 0; c < nCol; c++){
s += cell[r,c]; … (1)
}
}
(後処理)
return s;
}
似た形として、平均値を出す関数や配列の中身をインクリメントする関数など、
(1)の部分だけが異なる関数をたくさん作りたいと思っています。
ただ、(1)の部分だけ違う関数を作るにはこのままではループ部分や前処理・後処理も
記述しないといけません。
新しく関数を付け加えたいとき、できれば(1)の部分だけ書けばいいような形に
したいのですが何かいい方法がありませんか?
なお、ループの回数が多いため(1)の部分は関数呼び出しの形にはしたくないです。
(コンパイルしてインライン展開されるならok)
0975デフォルトの名無しさん
2006/01/08(日) 00:23:120976デフォルトの名無しさん
2006/01/08(日) 00:24:060977デフォルトの名無しさん
2006/01/08(日) 01:19:06typedefは別の名前をつけるだけで、全部同じ型だよ。
でも、例に挙げているのは全部同じ単位だから、別の型に定義するのは
止めといた方が……double使うのなら素直に基本単位にして使うのが
吉だと思う。
0978デフォルトの名無しさん
2006/01/08(日) 01:22:02MetaProgram
0979デフォルトの名無しさん
2006/01/08(日) 02:12:46vectorクラス、mapクラス ...と勉強していっていきなり
basic_stringコンテナとか不明な表現が出てきて困っています
察するに今までのvectorやmapも各々
vectorコンテナ
mapコンテナ
的な感覚でいいのでしょうか
0980デフォルトの名無しさん
2006/01/08(日) 02:22:41ひっくるめて、コンテナクラスライブラリといったりするね。
C++ だとそれを実現するためにテンプレートを使うから、
テンプレートライブラリと言うことも多いけど。
0981デフォルトの名無しさん
2006/01/08(日) 02:26:18container = 入れ物
和訳してみれば分かりやすいものも結構ある。
頑張れ。先は長いぞ。
0982デフォルトの名無しさん
2006/01/08(日) 02:35:310983デフォルトの名無しさん
2006/01/08(日) 02:48:09>>981
はい、ありがとうございます
せめてヘッダーの中が読めればいいのですが・・・
精進します
0984デフォルトの名無しさん
2006/01/08(日) 03:46:00enum型の型をclass A{…}の外で実装しようとしたのですが
class A{
public:
enum Event;
};
enum A::Event{ onClick, onMove }; //この行で未定義のシンボル A::Eventとエラーがでてしまいました
どう書けば良いのですか…ご教示お願いします
0985984
2006/01/08(日) 03:48:190986984
2006/01/08(日) 04:04:140987デフォルトの名無しさん
2006/01/08(日) 06:28:01出来ないことはヤメロ。
0988デフォルトの名無しさん
2006/01/08(日) 07:05:07こんなんで。それなりの最適化するコンパイラならインライン化は十分期待できるんじゃないかな。
もちろん関数ポインタじゃなくて関数オブジェクトで書いてもいいけど好みで。
#include <iostream>
const int nRow = 3, nCol = 2;
int cell[nRow][nCol];
template<class T, void func(T&, int&)>
T apply() {
T tmp = 0;
for (int r = 0; r < nRow; ++r)
for (int c = 0; c < nCol; ++c)
func(tmp, cell[r][c]);
return tmp;
}
void inc(int &tmp, int &x) { ++x; }
void add(int &tmp, int &x) { tmp += x; }
typedef int apply_func(void);
apply_func *all_inc = apply<int, inc>;
apply_func *sum = apply<int, add>;
int main() {
all_inc();
std::cout << sum() << std::endl;
}
0989974
2006/01/08(日) 11:20:58あーなるほど、関数ポインタ自体をテンプレートにしてしまえばいいのか。
自分で考えたときには関数ポインタを引数で渡す形しか思い浮かばなかったので、
これじゃインライン展開されないよなぁ…ということでドツボにはまってました。
MetaProgramってのははじめて聞きました。
でもやることに対してちょっと大掛かりすぎるので今回は見送りたいと思います。
これで見難いマクロで無理やり実現する必要がなくなりそうです。
どうもありがとうございました。
0990デフォルトの名無しさん
2006/01/08(日) 11:29:590991デフォルトの名無しさん
2006/01/08(日) 12:12:460992デフォルトの名無しさん
2006/01/08(日) 12:14:18「テンプレートは別スレ」という表現はどうかと思う。
0993デフォルトの名無しさん
2006/01/08(日) 12:25:49C++相談室 part46
http://pc8.2ch.net/test/read.cgi/tech/1136690107/
0994デフォルトの名無しさん
2006/01/08(日) 12:43:230995デフォルトの名無しさん
2006/01/08(日) 12:44:110996デフォルトの名無しさん
2006/01/08(日) 12:45:320997デフォルトの名無しさん
2006/01/08(日) 12:46:480998デフォルトの名無しさん
2006/01/08(日) 12:58:430999デフォルトの名無しさん
2006/01/08(日) 13:01:441000デフォルトの名無しさん
2006/01/08(日) 13:01:4410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。