トップページ⇒tech
1001コメント322KB

C++相談室 part45

レス数が1000を超えています。これ以上書き込みはできません。
0001(*^ー゚)b グッジョブ!!2005/11/26(土) 21:20:04
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前には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:19
boostかどっかにstrong_typedefってなかったっけ?
0953デフォルトの名無しさん2006/01/07(土) 10:45:00
D言語にするか、クラスにするかのどちらか
0954デフォルトの名無しさん2006/01/07(土) 10:49:49
D言語なんか問題外。ここはC++スレです。
0955デフォルトの名無しさん2006/01/07(土) 10:50:57
BOOST にあるね。
boost/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:43
こういう単位付きの量を表すためのライブラリってなんかBoostで作りかけのものがあったような気がする。
0957デフォルトの名無しさん2006/01/07(土) 11:08:15
boost.mpl のチュートリアルに速度と質量とを掛け算したもの同士でしか比較できないとか
速度/時間 * 時間 == 速度 とか、数値と物理単位を同時にあつかうような例があったと思う。
0958デフォルトの名無しさん2006/01/07(土) 11:17:07
>>957 少なくとも次元を考慮して欲しいよね。
0959デフォルトの名無しさん2006/01/07(土) 14:39:33
>>959
五右衛門も忘れないでね。
0960デフォルトの名無しさん2006/01/07(土) 17:09:39
くぁwせdrftgyふじこlp;「」’
0961デフォルトの名無しさん2006/01/07(土) 17:12:42
とっつぁ(ry
0962デフォルトの名無しさん2006/01/07(土) 19:28:27
お前ら面白すぎ
0963デフォルトの名無しさん2006/01/07(土) 19:32:37
元々ハンガリアン記法は、型名を付けるんじゃなくて、
型の意味を付けるはずだった、と言う話を思い出した。
inchAvgDistance += mmDist[0];
で間違いが直ぐ判るとかなんとか。
0964デフォルトの名無しさん2006/01/07(土) 19:51:04
全然わからん
09653432006/01/07(土) 22:21:08
#defineを使って
としてCLASSES(Hoge)を
class Hoge; class HogeFactory;
と展開させられないでしょうか
お願いします
09669652006/01/07(土) 22:25:31
誤爆、965≠343です
0967デフォルトの名無しさん2006/01/07(土) 22:39:34
class Hoge; class Hoge ## Factory;
0968デフォルトの名無しさん2006/01/07(土) 22:41:15
>>967 の ## の前後のスペースはいらないね。
って、2ch だと勝手に入っちゃうんだったっけ?

それはそうと、開区間、閉区間、片開区間を表現する
標準的なクラスって用意されていましたっけ??
09699652006/01/07(土) 23:19:47
>967
お早いレスありがとうございます。
おかげさまで、いろいろやりたかったことができそうです。
0970デフォルトの名無しさん2006/01/08(日) 00:03:00
>>968
標準にはないけどboostになら
Boost Interval Arithmetic Library
http://www.boost.org/libs/numeric/interval/doc/interval.htm
0971デフォルトの名無しさん2006/01/08(日) 00:05:46
>>965
俺もそんなことをやったことがあったが、
結局後でテンプレート使えば言いやということに気付いて#defineには引っ込んでもらった。
0972デフォルトの名無しさん2006/01/08(日) 00:08:02
Boost にはあるのか。使おうかな。
Boost って本当に何でもあるよな。

えらい人たちが標準化も視野に入れてやってるんだから
大丈夫だとは思うけど、なんでもいれちゃえ、って
感じじゃないんだろうか・・・
0973デフォルトの名無しさん2006/01/08(日) 00:11:02
>>972
Boostに収録されるまでにも過程があって、
認められないと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:12
cell[r,c]はcell[r][c]の間違いです。
0976デフォルトの名無しさん2006/01/08(日) 00:24:06
>>974 関数オブジェクト
0977デフォルトの名無しさん2006/01/08(日) 01:19:06
>951
typedefは別の名前をつけるだけで、全部同じ型だよ。

でも、例に挙げているのは全部同じ単位だから、別の型に定義するのは
止めといた方が……double使うのなら素直に基本単位にして使うのが
吉だと思う。
0978デフォルトの名無しさん2006/01/08(日) 01:22:02
>974
MetaProgram
0979デフォルトの名無しさん2006/01/08(日) 02:12:46
今猫のページでC++を勉強してるのですが、
vectorクラス、mapクラス ...と勉強していっていきなり
basic_stringコンテナとか不明な表現が出てきて困っています
察するに今までのvectorやmapも各々
vectorコンテナ
mapコンテナ
的な感覚でいいのでしょうか
0980デフォルトの名無しさん2006/01/08(日) 02:22:41
>>979 Yes
ひっくるめて、コンテナクラスライブラリといったりするね。
C++ だとそれを実現するためにテンプレートを使うから、
テンプレートライブラリと言うことも多いけど。
0981デフォルトの名無しさん2006/01/08(日) 02:26:18
>>979
container = 入れ物
和訳してみれば分かりやすいものも結構ある。
頑張れ。先は長いぞ。
0982デフォルトの名無しさん2006/01/08(日) 02:35:31
>>951 次元解析は Barton and Nackman trick と呼ばれる有名な解決法あり。
0983デフォルトの名無しさん2006/01/08(日) 02:48:09
>>980
>>981
はい、ありがとうございます
せめてヘッダーの中が読めればいいのですが・・・
精進します
0984デフォルトの名無しさん2006/01/08(日) 03:46:00
クラス内でプロトタイプ宣言した
enum型の型をclass A{…}の外で実装しようとしたのですが

class A{
public:
  enum Event;
};

enum A::Event{ onClick, onMove }; //この行で未定義のシンボル A::Eventとエラーがでてしまいました

どう書けば良いのですか…ご教示お願いします
09859842006/01/08(日) 03:48:19
すいません、↑は enum A::Event={ onClick, onMove };と書き間違えました
09869842006/01/08(日) 04:04:14
985は間違いです…ごめんなさい、もう寝ます
0987デフォルトの名無しさん2006/01/08(日) 06:28:01
>>984
出来ないことはヤメロ。
0988デフォルトの名無しさん2006/01/08(日) 07:05:07
>>974
こんなんで。それなりの最適化するコンパイラならインライン化は十分期待できるんじゃないかな。
もちろん関数ポインタじゃなくて関数オブジェクトで書いてもいいけど好みで。
#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;
}
09899742006/01/08(日) 11:20:58
>988
あーなるほど、関数ポインタ自体をテンプレートにしてしまえばいいのか。
自分で考えたときには関数ポインタを引数で渡す形しか思い浮かばなかったので、
これじゃインライン展開されないよなぁ…ということでドツボにはまってました。

MetaProgramってのははじめて聞きました。
でもやることに対してちょっと大掛かりすぎるので今回は見送りたいと思います。

これで見難いマクロで無理やり実現する必要がなくなりそうです。
どうもありがとうございました。
0990デフォルトの名無しさん2006/01/08(日) 11:29:59
梅
0991デフォルトの名無しさん2006/01/08(日) 12:12:46
新スレは?俺が立てるの?
0992デフォルトの名無しさん2006/01/08(日) 12:14:18
テンプレートスレはなくなったから、
「テンプレートは別スレ」という表現はどうかと思う。
0993デフォルトの名無しさん2006/01/08(日) 12:25:49
新スレ
C++相談室 part46
http://pc8.2ch.net/test/read.cgi/tech/1136690107/
0994デフォルトの名無しさん2006/01/08(日) 12:43:23
埋まるまで息止める
0995デフォルトの名無しさん2006/01/08(日) 12:44:11
苦しい早く埋めてくれ
0996デフォルトの名無しさん2006/01/08(日) 12:45:32
afsd
0997デフォルトの名無しさん2006/01/08(日) 12:46:48
うめ
0998デフォルトの名無しさん2006/01/08(日) 12:58:43
埋めはらがー
0999デフォルトの名無しさん2006/01/08(日) 13:01:44
うめ
1000デフォルトの名無しさん2006/01/08(日) 13:01:44
コンクラーベ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。