[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 06/13 21:23 / Filesize : 84 KB / Number-of Response : 309
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.43【環境依存OK】



1 名前:デフォルトの名無しさん [2007/09/27(木) 11:39:04 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.42【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1188748806/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


29 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:12:40 ]
>>26
C++においては特に無いんじゃね?
メンバ関数を持たずある用途のためにまとめた”変数のセット”
って言う意味を強調したいときに
俺はあえてstructを使うけど。


30 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:35:52 ]
>>28-29
ありがとうごさいました

31 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:16:18 ]
>>11>>19
boost::bind(&Cfunc::func, &cf, _1)は、
boost::bind(boost::mem_fn(&Cfunc::func), &cf, _1)相当。

mf = boost::mem_fn(&Cfunc::func)とすると、
mf(a, b)は、a.func(b)と同じ。
つまり、mem_fnはメンバ関数を通常の関数呼出の構文で
呼び出せるようにするアダプタと言える。

>>12へ続く。


32 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:34:34 ]
std::string str

switch( str )
{
  case "あいうえお"
    funcA();
    break;

  case "かきこくけこ"
    funcB();
    break;

  (同様に続く・・・)
}

のように処理させたいけど文字列な為に出来ません
この様な場合どういうやり方が一般的ですか?

if文でゴリゴリ書くしかない?

33 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 15:12:10 ]
一般的じゃないかもしれないけどこういう手が楽っぽい

#include <map>
#include <string>
#include <iostream>

void funcA() { std::cout << "invoke func A\n" ; }
void funcB() { std::cout << "invoke func B\n" ; }

int main(void) {
 std::map< std::string, void(*)(void) > funcs ;
 funcs[ "あいうえお" ] = funcA ;
 funcs[ "かきこくけこ" ] = funcB ;

 std::string str = "あいうえお" ;
 void(*f)(void) = 0;
 f = funcs[str];
 if ( !f )
  // default: の処理
 else
  f();

 return 0;
}
要は条件をキー、呼び出す関数を値にするmapだな
値をboost::functionへの参照とかにしてやれば、動的なオブジェクトのメソッドを呼び出すことも可能

34 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 15:40:21 ]
>>33
ありがとうございました

35 名前:デフォルトの名無しさん [2007/09/28(金) 16:53:01 ]
C++初学者です。
std::fstream等を使い、テキストファイルの中身をstd::stringのオブジェクトに格納したいと思います。
テキストファイルtext.txtはShift_JISで書かれ、空白や改行、マルチバイトの文字を含みます。サイズは不明です。
この改行などは、可能な限り保持するとします。

自分は、以下のようなコードを記述しました。

std::string str;
std::ifstream ifs;

ifs.open("text.txt",std::ios::in);
if(!ifs.is_open()) return; //オープン失敗

while(!ifs.eof())
{
 std::string line;
 std::getline(ifs,line);
 str += line + "\n";
}

1.getlineや>>を使って、少しずつ読み込むという方法で良いのか分かりません。一括読み込みの方法はあるのでしょうか。
2.getlineを使う場合、一時的にlineを用意し、それからstrに格納する方法を採っています。何となく冗長な気もしますが、こんなもんなのでしょうか。
3.最後に改行コードを付加する時、+"\n" という書き方をしていますが、std::endlを使う方法、もしくはそれに似たような方法はあるのでしょうか。


36 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 17:00:48 ]
ファイルの中身を全部読み取りたかったら、istreambuf_iterator使えばいい。
typedef std::istreambuf_iterator<char> isb_it;
str.assign(isb_it(ifs), isb_it());

37 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 17:20:14 ]
C++ってキモk



38 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 17:26:59 ]
>>35
> 2.
大体皆そういうコードを書く
> 3.
stringstreamを使えばよい

39 名前:デフォルトの名無しさん [2007/09/28(金) 17:27:12 ]
プログラムからMSXMLを使用してローカル(C:\.....\foo.xml)のXMLファイルを読み込みたいのですが
どうもload関数で失敗してしまいます。

#import "msxml.dll" named_guids raw_interfaces_only
using namespace MSXML;

MSXML::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(MSXML::CLSID_DOMDocument);
pDoc->put_async(VARIANT_FALSE);
VARIANT_BOOL f;
hr = pDoc->load(_variant_t(L"C:\\Documents and Settings\\.........\\foo.xml"), &f);

このXMLファイルのパスに実際Web上に存在するファイルを指定したらloadは正常にXMLを取得出来ました。(....../foo.xml
ローカルにあるXMLファイルを読み込むには何か特殊な事をしなければいけないのでしょうか?
環境はWinXPでVisual Studio 2005 Pro Editionです。

40 名前:35 mailto:sage [2007/09/28(金) 17:32:10 ]
>36>38
ありがとうございます、助かりました

41 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:05:32 ]
>>35
2.についてだが、普通はこう書く。

std::string line;
while (std::getline(ifs, line)) {
  :
}

しかし、>>35のコードでは結局行読みすることに何の意味もないコードに
なっている。
そもそもそういう場合はstd::getline()を使うべきではないだろう。

42 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:07:12 ]
>>39
load()でローカルファイルを普通によめたと思うが。
MSXMLのバージョンにもよるのかも知れんが。

それとそのパスはなにやら胡散臭いな。
argvでも渡して、カレントのパスや相対パス、絶対パス、漢字を含むもの
含まないもの、色々実験汁。

43 名前:デフォルトの名無しさん [2007/09/28(金) 18:09:05 ]
マジWindowsアプリとか詳しい奴尊敬するぜ
あんな分かりにくいもん C++の難しさよりも
ライブラリ覚えるだけで大変そう

44 名前:デフォルトの名無しさん [2007/09/28(金) 18:13:44 ]
>>42
"C:\\foo.xml"で試してみましたが無理でした。
SetCurrentDirectory()でxmlのあるディレクトリに移動して相対パスでの指定も試してみました。
バージョンによる違いも一応調べてみます。

45 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:19:26 ]
>>43
あんなに膨大にあるAPIを全部暗記してる奴はいないだろう
関数の名前覚えてたって、引数の並び順だの何だの覚えきれねえよ

それに良く使いまわす処理は俺ライブラリ化するなりコピペするなり
いちいち一から書かんだろ

46 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:19:58 ]
file:// とかは?

47 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:22:42 ]
>>43
今はほとんどどの世界に行っても、言語仕様よりライブラリ覚える方が大変だよ



48 名前:デフォルトの名無しさん [2007/09/28(金) 18:25:17 ]
>>46
file://の書き方は
file:///C:/foo.xmlであってるでしょうか?あまり詳しくないもので・・・。
フォルダのアドレスバーにfile://と入力して出てきたやつをそのまま使ってみました。
でも、やはりロードで失敗してしまいます。xmlファイル自体に問題があるか、MSXMLのバージョンの問題なのか・・・

49 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:26:47 ]
>>48
ファイルに問題があるかどうか切り分けたければ、URL越しでロードできた
ファイルをローカルに落として試せばいいだろ。

50 名前:デフォルトの名無しさん [2007/09/28(金) 18:33:30 ]
>>49
Webからxmlファイル落としてローカルで試したところloadすることが出来ました。
どうやら自分のxmlファイルに問題があったようです。
xmlファイルの中身を見比べてみて原因を探ってみます。

51 名前:デフォルトの名無しさん [2007/09/28(金) 18:33:49 ]
>>47
オープン系はそうですね
組み込みはそうでもなくて、純粋にC++に集中できそう

52 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:34:53 ]
IXMLDOMDocument::loadは、IStreamなんぞも受け付けるらしいから、
SHCreateStreamOnFileでも使ってストリーム化したらどうだろう?

53 名前:デフォルトの名無しさん [2007/09/28(金) 18:35:42 ]
どうやら文字コードが原因だったみたいです。
自作のxmlはShift_JISで、正常に読み込める方のxmlはUTF-8で保存されたものでした。
なんでShift_JISでダメなのかはよく分かりませんが、とりあえずUTF-8で書くことでやっていきたいと思います。
ありがとうございました。

54 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:38:16 ]
XML宣言でエンコーディングを指定すれば、
Shift_JISは受け付けてくれると思う、MSXMLなら。

55 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:39:41 ]
>>53
既にC/C++の話題でも何でもないが


XMLファイルで↓のようにちゃんとエンコーディングは指定してるか?
<?xml version="1.0" encoding="Shift_JIS"?>

56 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:42:11 ]
環境依存とかマジわかんねえ
XMLなんて言葉しか知らん

57 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:50:03 ]
>>53
HRESULTの判定をしてないのがいかんのだな。
その辺が出来ないなら raw_interfaces_onlyは使うなよ。



58 名前:デフォルトの名無しさん [2007/09/28(金) 19:17:04 ]
>>54-55
対象のXMLファイルにはちゃんと
<?xml version="1.0" encoding="Shitf_JIS" ?>
と先頭に記述はしていました。ますます分からないですけど、
もしかしたら俺の環境がどこか特殊なのかもしれないので(または全然関係ないところのエラー)、
あまり悩まれない方がいいかもしれませんw

59 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 19:43:41 ]
>>58
MSXMLがちゃんとエラーメッセージが返してるからそれみりゃわかるって。
エラーメッセージの取り出し方わかってる?

60 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 19:50:46 ]
>>58
Shitf_JIS
しとふ・じす

61 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 20:01:36 ]
>>60
天才じゃね?

62 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 20:27:36 ]
爆弾クラスのデストラクタに壁を壊す処理を入れてるんですが
こういう使い方は良くないと聞きました
どうしてですか?
だとしたら自分を壊して壁を壊すような処理はどこに書けばいいんですか?
よくわからなくなったので教えて下さい

63 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 21:07:08 ]
>>62
通報しますた

64 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 21:26:46 ]
いやいやいや
ゲームのアイテムの話ですよ?

65 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 21:44:40 ]
>>62
理由:クラスの柔軟性が損なわれる

「インスタンスの破壊時に必ず呼ばれる」
→爆発させずに爆弾を消去するときも破壊判定させる気?

「デストラクタは引数とれない」
→わざわざ破壊対象の壁の情報を他のクラスに問い合わせるわけ?

それなら自分が爆発(explodeメソッド)するって情報だけ他のクラスに送って
それ以外の処理は他に任せるようにした方が責任の所在が明確になって
まだ良い設計になると思わない?

俺が思いつくのはとりあえずこんな所

66 名前:682 mailto:sage [2007/09/29(土) 00:47:46 ]
001.ppm
002.ppm


xyz.ppm
という内容のファイルリストからgetlineで画像名を読み込み、
それぞれの画像のカラーヒストグラムを書き出していくという
プログラムを作成しています。

一度に処理する画像枚数が約200枚までならば正常に動作するのですが、
一度に処理する画像が300枚前後になると、OSが急に固まりコンソールに
強制終了と表示されて、プログラムが終了してしまいます。

以下、メインのソースの一部
ifstream filelist
While(!filelist.getline(filename, sizeof(filename)).eof()) {
Image24 test_image;
ここらへんで様々な処理
}

この例の場合、ループでtest_imageが宣言される度に
デストラクタは呼び出されるのでしょうか?(デストラクタでメモリを解放する処理は書いてます)

長文ですがよろしくお願いします。

67 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 00:54:53 ]
>>66
デストラクタは呼ばれます。
実験してみりゃ一発なのに・・・



68 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 01:18:09 ]
>>66
とりあえずアップしてるソースの範囲は問題なし。
デストラクタの開放処理に漏れや誤りがあるか、
「ここらへんで様々な処理」 に問題があると思う。
LoadImageしてDeleteObjectしてないとか、LD_SHAREDしてるとか。

69 名前:66 mailto:sage [2007/09/29(土) 01:54:27 ]
>>67, >>68
ありがとうございます。
メモリ周りの処理をもう一度徹底的に見直してみます。

70 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 02:26:26 ]
int型を文字列の型に変換する関数ってありますか?

71 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 02:33:56 ]
Cならsprintf, snprintf
C++なら(関数ではないが)std::ostringstream. boost::lexical_cast

72 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 02:41:40 ]
ありがとうございます

73 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 20:18:04 ]
class string_ex : public std::string
{
  funcA();
  funcB();
}

のようにstd::stringを拡張してstd::stringの機能をそのままに
文字列操作を行う関数を新たに追加したクラスを作りました

string_ex ex;
std::string str;

ex = str;

という操作を期待したのですがコンパイルエラーが出てしまいます
何か良い方法はありませんか?

74 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 20:51:03 ]
代入演算がないだけでは?

75 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 20:55:57 ]
確かstd::stringは継承される事を前提に作られてないはず
やめといた方がいいんじゃね

デストラクタも仮想じゃないし

76 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:06:33 ]
>>74-75
ありがとうございます

そうですか、スッキリして良いと思ったのですが残念です

77 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:08:52 ]
コンストラクタがないからstd::stringからstring_exに変換できない。
ただし、>>75の指摘通り使用に際しては注意が必要。



78 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:14:51 ]
コピー代入演算子とコピーコンストラクタが無いのが原因だな

#include <string>

struct A : public std::string {
  A(){}
  A(const A&){}
  A& operator=(const A&) { return *this; }
  A& operator=(const std::string&) { return *this; }
};

int main() {
  A a;
  std::string b;
  a = b;
}

とりあえずこんな感じでそれらを用意してやれば通る、けどやっちゃいけないよこんな事
basic_stringのカオスさ加減をどうにかしたい気持はわからんでもないけど

79 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:32:11 ]
どうやらstd::stringを弄るのは禁じ手のようですね

無理にメンバ関数にしないでフリーの文字操作関数にします
いろいろとありがとうございました

80 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:57:56 ]
俺も同じことやってる。
コンストラクタ、代入演算子、あたりを全部作らないといけない上に、const / 非constの制御がかなり面倒。

でもやりたいよね…。ヘルパー作ってばっかだと、なんのためのオブジェクト指向か分からないし。

81 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 22:21:44 ]
>>73
仮想デストラクタを持たないstringやコンテナなどから
派生クラスを作る誘惑に負けるな by スコット・メイヤーズ

82 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:03:16 ]
#include <stdio.h>

main()
{
int i;
int b;
int c;
int d;
printf("最初の数字を入れてください(半角)=>");
scanf("%d", &i);
printf("なに算をするか入れてください( / * - + )=>");
scanf("%s", &b);
if(b = /){
printf("割る数を入れてください=>");
scanf("%s", &c);
d = i / c;
}else if(b = *){
printf("賭ける数を入れてください=>");
scanf("%s", &c);
d = i * c;
}else if(b = +){
printf("足す数を入れてください=>");
scanf("%s", &c);
d = i + c;}else{
printf("引く数を入れてください=>");
scanf("%s", &c);
d = i - c;}
printf("%d\n",d);}
これでものすごい勢いでコンパイラエラー吐かれます><
初心者といううか見様見真似でつくったのでどこがだめかエラー見ただけじゃわからない
のでどこがおかしか教えてくださるとうれしいです

83 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:06:56 ]
何算するかというところで、
+-/*という数値でないものを入力しようと言うのに
intという数値を扱う型で読み込もうとしているのがいけない。
bはchar型にし、%cで読み込めばいい。
そして、if (b == '/') {のようにする。

84 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:08:30 ]
>>83
intは数値だったんですか;
いろいろがんばってみます

85 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:11:39 ]
intはintegerの略。

86 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:06:21 ]
>>82
・コンパイルエラーがたくさん出ても焦るな。先頭の1つから順に消していけばいい。
・見よう見まねで作ったならエラー出て当然。まずはもう少し自分で理解する努力をしてから人に聞け。
・人に聞くなら、どんなエラーが出たのかぐらいは書くべき。

87 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:43:22 ]
>84まず入門書か入門サイト嫁www



88 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 11:42:09 ]
_typeof, __typeof
みたいに前にアンダーバーを1つ2つ付けるのは
予約キーワードと衝突するおそれがあるので避けるべきらしいですが、
typeof_, typeof__
みたいに後ろに付けるならおkでしょうか?

89 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 12:23:07 ]
アンダースコアが2個続くのは先頭でも途中でも最後でもだめ

90 名前:デフォルトの名無しさん [2007/09/30(日) 12:49:51 ]
template<typenamt t, typename sig> class test;
template<typenamt t, typename result, typename arg> class test<t, result (t::*)(arg)>{ result r; };//resultがvoidだとエラーになるので
template<typenamt t, typename arg> class test<t, void (t::*)(arg)>{};//特殊化したい

んですが、コンパイラからは「特殊化できない」とエラーになります。

引数の数が被ってるのがダメなのかと思い、
template<typenamt t, typename sig, typename dammy1, typename dammy2> class test;
template<typenamt t, typename result, typename arg> class test<t, result (t::*)(arg), void, void>{ result r; };
template<typenamt t, typename arg> class test<t, void (t::*)(arg), void, void>{};
としてもやはりダメでした。

91 名前:(90) mailto:sage [2007/09/30(日) 12:50:52 ]
ちなみに上下共に同じエラーで弾かれます。

92 名前:(90) mailto:sage [2007/09/30(日) 13:03:41 ]
後者にしたうえで、
template<typenamt t, typename arg> class test<t, void (t::*)(arg), void, void>{};

template<typenamt t, typename arg> class test<t, void, arg>{};
としtemplate<typenamt t, typename result, typename arg> class testの特殊化を狙っても
「テンプレート引数の数が少なすぎます」とダメでした。

93 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:04:35 ]
ちょっと質問。

ヘッダをインクルードする時、ファイル名だけ指定してインクルードパスで検索する方法と、
インクルードパスを限定して、相対パスでファイルを指定する方法とではどちらが一般的でしょうか?

ヘッダが100近いフォルダに散在していると前者と後者のどちらを適用すべきか判断がつきません。
他のプロジェクトで類似するケースではどのようにしているのか聞いてみたいんですが。
ちなみにヘッダファイルの移動はないことを前提としています。


94 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:04:48 ]
int main(){
(処理)
return 0;
}

何で0を返すんですか?
1ではダメなのですか?

95 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:20:19 ]
>>94
いいよ〜
終了コードの使い方は処理系依存だけど、一般的には
0が正常終了、エラーや警告があれば1以上の数字を返すのが慣例。

96 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:25:37 ]
>>90
gcc 3.4.4 だと通った。 詳しいことは解らんけど、それだけ報告。

#include <stdio.h>
template<typename t, typename sig> class test {
public: static void foo(){ printf("foo\n"); }
};
template<typename t, typename arg> class test<t, void (t::*)(arg)> {
public: static void foo() { printf("bar\n"); }
};
class X{};
int main()
{
test<int,int>::foo();
test<X, void(X::*)(int)>::foo();
}

97 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:48:55 ]
>>93
適材適所。
そのたくさんのディレクトリが相互に無関係ならそれぞれパス指定するしかないと思う。
そうではなく、ある程度共通のディレクトリの中に分散しているのなら、共通部をパス指定して
残りはファイル名で記述すればいいだろう。
例えば、こんな感じ。
--
/home/who/someProject/include/catA/inc1.h
/home/who/someProject/include/catA/inc2.h
/home/who/someProject/include/catA/inc3.h
/home/who/someProject/include/catB/inc4.h
/home/who/someProject/include/catC/inc5.h
こんなインクルードファイルがあるなら、
#include "catA/inc1.h"
#include "catA/inc2.h"
#include "catA/inc3.h"
#include "catB/inc4.h"
#include "catC/inc5.h"
と記述してパス指定に$HOME/someProject/includeを追加。




98 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:07:02 ]
>>90
コンパイラは何を使っている。
また、そもそも何をしたい?それ次第では別の手段があるかもしれない。

99 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:16:00 ]
>>90
#include <stdio.h>
#include <boost/type_traits.hpp>

class test1 {
public: static void foo() {printf("test1\n"); }
};
template<typename t, typename result, typename arg>
class test2 {
public: static void foo() {printf("test2\n"); }
};
template<typename t, typename arg>
class test3 {
public: static void foo() {printf("test3\n"); }
};

namespace detail {
template<typename t, typename sig> struct selector {
 typedef test1 type;
};

template<typename t, typename result, typename arg> struct selector<t, result (t::*)(arg)> {
 typedef typename boost::mpl::if_<boost::is_void<result>, test3<t,arg>, test2<t,result,arg> >::type type;
};
}

int main(int argc, char *argv[]) {
 detail::selector<test1,void>::type::foo();
 detail::selector<test1,int(test1::*)(int)>::type::foo();
 detail::selector<test1,void(test1::*)(int)>::type::foo();
 return 0;
}

100 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:18:29 ]
そもそも>>90のresult r;って、
コンパイラさえ問題なく、しかもrがvoid型なら、
<t, void (t::*)(arg)>なんて特殊化は
不要だと思ったのだが違うのか?

101 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:20:32 ]
>>93
インクルードパスにはあまりごちゃごちゃ含ませないことが望ましい。
インクルードパスに含まれるヘッダの名前は実質システムグローバルだからな。

行儀のいいやりかたは、>>97のように、インクルードパス直下にヘッダを
置かず、モジュールだのライブラリだの用のディレクトリを掘り、その下に
ヘッダを入れることだ。
そうすることで、汚染する名前をディレクトリ名だけに限定でき、
名前の衝突を回避しやすくなる。
勿論、これにはインクルードパスの下をあまりとっちらからせずに、整理整頓できる
というメリットもある。

102 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:28:50 ]
boostみたいに実装詳細のヘッダをhoge/datail に入れておくと
外部公開するヘッダとプライベートなヘッダを分けられてうれしい

103 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:32:36 ]
svnのboost::function_typesなら関数の型から、戻り値や引数を取りだせるから
それとenable_ifで特殊化してやる方法もある

#include <iostream>
#include <boost/function_types/result_type.hpp>
#include <boost/type_traits.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/utility.hpp>

void func_v() {}
int func() { return 0; }

template <
  typename sig
 , class Enable = void
> struct C { void f() { std::cout << "func\n"; } };

template <typename sig>
struct C< sig
    , typename boost::enable_if<
       typename boost::is_same<
         typename boost::function_types::result_type<sig>::type
        , void>::type>::type
     >
{ void f() { std::cout << "void func\n";} };

int main() {
  C< BOOST_TYPEOF(func_v) >().f();
  C< BOOST_TYPEOF(func) >().f();
}

104 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:34:33 ]
うへ

仕事では出会いたくないタイプのコードだな……
だからC++は(ry

105 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:34:45 ]
boost厨多過ぎ

106 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:39:40 ]
boostは順調に使えてる時点ではいいんだけど、
バグったりするともうお手上げ

107 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:45:56 ]
そのバグを自力で直して公式に反映できたり、
そこから新しい使い方を発見できる程になりたひ



108 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:23:09 ]
>>97
>>101
レスありがとうございます。

自分も正直ごちゃごちゃしたインクルードパスを書くよりは
プロジェクトのルートパスを一つ指定するような書き方が望ましいと思っているので、
その方向で調整して行きたいと思います。

ただ、好みの問題程度にあしらわれないか不安ではありますが。

109 名前:(90) mailto:sage [2007/09/30(日) 17:29:01 ]
使っているコンパイラはvisual C++ 2005です。
メンバ関数を特殊化で返り値、クラス、引数をそれぞれ特殊化した後に
内部に作っておいたクラスを使い間接的に返り値を特殊化したらコンパイルが可能になり解決しました。

110 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:40:52 ]
オーバーロードについて質問

int Func(int a=NULL);
string Func(string a="");

こんな感じで引数が無い場合に戻り値の型によって
関数がオーバーロードされるのを期待してみましたが
コンパイルエラーが出てしまいました

このような場合関数名を変えるしか無いのでしょうか?

111 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:45:01 ]
>>110
戻り値の型でオーバーロードはできません。

ポインタじゃないものに NULL を使っちゃだめです。

112 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:54:37 ]
>>111
ありがとうございます

113 名前:94 mailto:sage [2007/09/30(日) 18:43:55 ]
>>95
ありがとうございました。

114 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:02:40 ]
int x = 4896;
int y = 1406;

double z = y/x;

でzが0になってしまうのですが、
これを0.28....
とやるにはどうすれば良いのでしょうか?

115 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:04:23 ]
z = (double)y / x;

116 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:47:24 ]
わぁ、ありがとうございます。
ところで、double>intなのに
なんで代入変換されないのでしょうか?

117 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:51:35 ]
z=y/xという式は、まずy/xが実行される。
int/intなので結果はint、この時点で結果が0になる。
int型の0をdouble型に代入しても当然0になる。
(double)y/xとすることで、yがdoubleになりこの式の結果もdoubleになる。



118 名前:デフォルトの名無しさん [2007/10/01(月) 02:51:59 ]
int同士の/演算はint -> int -> intだから、代入する時点ですでに(intの)0なんだよ。
それをdoubleに変換したところで、0.0になるだけさ。

119 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:55:02 ]
なるほど、ありがとうございました!

120 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 03:47:41 ]
演算子の優先順位って奴だな

= よりも / の方が優先順位が高い

121 名前:デフォルトの名無しさん [2007/10/01(月) 03:54:49 ]
=の優先度がたかかったら使いにくくてしょーがねー。
(z=y)/x は欲しい結果じゃないだろ?除算結果捨ててるしなw


122 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:09:57 ]
メンバ変数をpublicメンバにして公開せずに入出力関数を用意すべきと言いますが
その際に入力用と出力用と2種類作った方が良いのでしょうか?

class Choge
{
private:
 std::string memo_;
public:
 std::string memo(const std::string& data = "")
 { return (data.empty() ? memo_ : memo_ = data); }
}

上のように入出力をまとめちゃった方がスッキリしそうな気がするのですが
少しトリッキーなようで、こんな事をしても良いのか迷ってます

123 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:12:09 ]
>>122
そのメンバを空にしたいときにはどうするんだ?
そんな癖のある仕様にするくらいなら、別々に作った方がいいことは自明だ。

124 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:25:17 ]
>>122
そもそも、メンバを参照するだけのmemo()がconstメンバ関数じゃないから使い難い。
設定用に非constメンバ関数、取得用にconstメンバ関数を用意するなら、最初から別々に作ればいい。
# 例えば、void func(Choge const & hoge)なんて関数からhoge.memo()を呼べないのは面倒だぞ。

125 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:54:48 ]
>>123-124
なるほど。
やっぱり別々にすべきですね。
ありがとうございました。

126 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:37:48 ]
ff5a_analyzer_src.zip (53 KiB)
ff5a_analyzer のソースコードです。まだ未完成です。文字コードは EUC-JP、改行コードは LR となっています。
とあるのですが
ttp://x11.s11.xrea.com/ff5a_analyzer_src.zip

このソースのコンパイルの仕方はどうやるのでしょうか
OSはXPです

127 名前:デフォルトの名無しさん [2007/10/02(火) 07:38:20 ]
はじめまして、すいませんが質問させてください。

Linux(Turnolinux Fuji)でsys/systeminfo.hを
includeしてSI_HOSTNAMEを使用したい< sysinfo(SI_HOSTNAME〜を対処したい >のですが、
コンパイル時にsys/systeminfo.hがないとエラーが出力されてしまいます。

どうすればよいのでしょうか?ご教授ください。




128 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:44:19 ]
探す。includeする。



129 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:44:46 ]
>>126
ちゃんとmakefileまでついてるじゃないか
gccみたいだけど別にほかのコンパイラでも大丈夫だろ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<84KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef