【初心者歓迎】C/C++室 Ver.43【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/09/27(木) 11:39:04ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.42【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1188748806/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2007/09/27(木) 12:05:39,r‐'″ ._,,,, `'lri,!'''″ ゙l
.,,,″ ,,r'"` ゙゙l, ゙ヘ, |
!アr, .l°.ェ'ニ,コ .| ゚ヘ、 |
`'i、 .く_,、vr''″ ., ゙'i、 .,,/
゙X、 ト ゙!,゛ .,,r‐--、
,、_,、 .,,,,r‐'″ | } .,,r‐'^’ .|゜
め゙゚“゙゙~゛ |  ̄` .,l゙
| ,i´ ,l゙
゙!、 ,i´ ,ノ
.'┐ ,,-° '=,, /`
.゚!, ,,,,r'″ ゙┐ ,l゙
゚'r, .''''"` │ .,,-''i、 /
`''x, .| | .,,r'" .゙┐ ,i´
~'ヘi,,, | |_,r・″ 'ヘ,、 l゙
`¬--|i,,,,,,,,,,,,,,,,v、r',广 ゙ヘ�=@ ,l゙
`゙'ーぃ--r'″ `'―、,,,,/
0003デフォルトの名無しさん
2007/09/27(木) 13:00:37>>999
'CFuncHolder::SetFunc' : 1 番目の引数を 'boost::_bi::bind_t<R,F,L>' から 'void (__cdecl *)(char *)' に変換できません。
って怒られました。
0004他板37
2007/09/27(木) 13:03:35↓の掲示板に書いてしまって、こちらの掲示板の皆様には申し訳ないのですが・・・。
http://pc11.2ch.net/tech/index.html#10
37なんですけど、継承方法がわからず困っています。
なんとなく、このままスルーされそうなので焦っています。
0005デフォルトの名無しさん
2007/09/27(木) 13:14:25とりあえずこんな感じにすると動いた
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <windows.h>
void g_func(const char* str) {
MessageBoxA(NULL, str, "", NULL);
}
class Cfunc {
public:
void func(const char* str) { MessageBoxA(NULL, str, "", NULL); }
void (Cfunc::* GetFuncPtr()) (const char*) { return &Cfunc::func; }
};
class CHolder {
public:
template <typename T> void set(const T& f) { func = f; }
boost::function<void(const char*)> func;
};
int main()
{
CHolder hold;
Cfunc cf;
hold.set( boost::bind(&Cfunc::func, &cf, _1) );
hold.func("text");
}
00065
2007/09/27(木) 13:15:03typo typo
0007デフォルトの名無しさん
2007/09/27(木) 13:20:30void SetFunc(boost::function1<void, char*> func){m_func = func;}
0008デフォルトの名無しさん
2007/09/27(木) 15:58:29CStringListみたいなやつで
0009デフォルトの名無しさん
2007/09/27(木) 16:03:280010デフォルトの名無しさん
2007/09/27(木) 16:18:110011デフォルトの名無しさん
2007/09/27(木) 16:52:33誰か噛み砕いて教えてくれないだろうか。
boost::bind(&Cfunc::func, &cf, _1)
0012デフォルトの名無しさん
2007/09/27(木) 17:04:050013デフォルトの名無しさん
2007/09/27(木) 17:20:350014デフォルトの名無しさん
2007/09/27(木) 17:29:12で、boost::bindはなにやら拘束とかいうのをして2引数の関数を1引数の関数として扱える?のだとかなんとか・・・
>>5でいうところの、
普通のグローバル関数g_funcへのポインタというかアドレスはg_funcで、
メンバ関数CFunc::funcのアドレスは&Cfunc::func?
でもそれだけだとどのインスタンスのfuncかわからんから、
Cfunc cfっていうインスタンスの情報もどうにか渡す必要があるってのはわかる。
が、それらを拘束するっていうのの意味が分からない。拘束ってなんですか?
リファレンスの日本語訳読んでも全然分からない・・・
0015デフォルトの名無しさん
2007/09/27(木) 17:46:30まず概念を理解せんことにはな。
Haskellあたりで勉強してきたら?
0016デフォルトの名無しさん
2007/09/27(木) 18:06:02STL の bind1st と bind2nd を調べてくればわかるんじゃない
0017デフォルトの名無しさん
2007/09/27(木) 18:11:30なにかしら定数として固定して、引数が1変数の関数としてCFuncHolderのm_funcにしまえる?
ってことですか?
class CFuncHolder{
private:
boost::function1<void, int> m_func;
public:
CFuncHolder(){};
void SetFunc(boost::function1<void, int> func){m_func = func;}
void RunFunc(int i){m_func(i);}
};
void gfunc1(int i){ printf("%d\n",i); }
void gfunc2(int i, int j){ printf("%d\n", i+j); }
void main(){
CFuncHolder fh;
fh.SetFunc(gfunc);
fh.RunFunc(1);
}
0018デフォルトの名無しさん
2007/09/27(木) 18:12:54拘束じゃなくて束縛だと思うが
関数型言語の束縛とも意味が違うので紛らわしい
どっちかっつーと「部分適用」だわな
001917
2007/09/27(木) 18:57:49そういう場合の決まった書き方ってことでとりあえず解決した。
0020デフォルトの名無しさん
2007/09/27(木) 19:52:13でスレッドを生成し、そのスレッドが無限ループしている場合、
プログラム終了時にそのスレッドも終了してくれるのでしょうか?
0021デフォルトの名無しさん
2007/09/27(木) 20:03:000022デフォルトの名無しさん
2007/09/27(木) 20:10:520023デフォルトの名無しさん
2007/09/27(木) 20:11:340024デフォルトの名無しさん
2007/09/27(木) 20:29:24char *buf = new char[1024];
}
上のコードでbufはプログラム終了時に解放されますってのと同レベルだな
0025デフォルトの名無しさん
2007/09/27(木) 20:54:17「破壊される」?
まぁ言葉遊びか
0026デフォルトの名無しさん
2007/09/28(金) 12:04:40何か違いがあるのでしょうか?
メリット、デメリットを教えてください
0027デフォルトの名無しさん
2007/09/28(金) 12:06:470028デフォルトの名無しさん
2007/09/28(金) 12:10:26structはデフォルトでpublic
class A : X { // <-- private 継承
int x; // <-- private メンバ
};
struct B : Y { // <-- public 継承
int x; // <-- public メンバ
};
それだけ
0029デフォルトの名無しさん
2007/09/28(金) 12:12:40C++においては特に無いんじゃね?
メンバ関数を持たずある用途のためにまとめた”変数のセット”
って言う意味を強調したいときに
俺はあえてstructを使うけど。
0030デフォルトの名無しさん
2007/09/28(金) 12:35:52ありがとうごさいました
0031デフォルトの名無しさん
2007/09/28(金) 14:16:18boost::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へ続く。
0032デフォルトの名無しさん
2007/09/28(金) 14:34:34switch( str )
{
case "あいうえお"
funcA();
break;
case "かきこくけこ"
funcB();
break;
(同様に続く・・・)
}
のように処理させたいけど文字列な為に出来ません
この様な場合どういうやり方が一般的ですか?
if文でゴリゴリ書くしかない?
0033デフォルトの名無しさん
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への参照とかにしてやれば、動的なオブジェクトのメソッドを呼び出すことも可能
0034デフォルトの名無しさん
2007/09/28(金) 15:40:21ありがとうございました
0035デフォルトの名無しさん
2007/09/28(金) 16:53:01std::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を使う方法、もしくはそれに似たような方法はあるのでしょうか。
0036デフォルトの名無しさん
2007/09/28(金) 17:00:48typedef std::istreambuf_iterator<char> isb_it;
str.assign(isb_it(ifs), isb_it());
0037デフォルトの名無しさん
2007/09/28(金) 17:20:140038デフォルトの名無しさん
2007/09/28(金) 17:26:59> 2.
大体皆そういうコードを書く
> 3.
stringstreamを使えばよい
0039デフォルトの名無しさん
2007/09/28(金) 17:27:12どうも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を取得出来ました。(http://....../foo.xml)
ローカルにあるXMLファイルを読み込むには何か特殊な事をしなければいけないのでしょうか?
環境はWinXPでVisual Studio 2005 Pro Editionです。
004035
2007/09/28(金) 17:32:10ありがとうございます、助かりました
0041デフォルトの名無しさん
2007/09/28(金) 18:05:322.についてだが、普通はこう書く。
std::string line;
while (std::getline(ifs, line)) {
:
}
しかし、>>35のコードでは結局行読みすることに何の意味もないコードに
なっている。
そもそもそういう場合はstd::getline()を使うべきではないだろう。
0042デフォルトの名無しさん
2007/09/28(金) 18:07:12load()でローカルファイルを普通によめたと思うが。
MSXMLのバージョンにもよるのかも知れんが。
それとそのパスはなにやら胡散臭いな。
argvでも渡して、カレントのパスや相対パス、絶対パス、漢字を含むもの
含まないもの、色々実験汁。
0043デフォルトの名無しさん
2007/09/28(金) 18:09:05あんな分かりにくいもん C++の難しさよりも
ライブラリ覚えるだけで大変そう
0044デフォルトの名無しさん
2007/09/28(金) 18:13:44"C:\\foo.xml"で試してみましたが無理でした。
SetCurrentDirectory()でxmlのあるディレクトリに移動して相対パスでの指定も試してみました。
バージョンによる違いも一応調べてみます。
0045デフォルトの名無しさん
2007/09/28(金) 18:19:26あんなに膨大にあるAPIを全部暗記してる奴はいないだろう
関数の名前覚えてたって、引数の並び順だの何だの覚えきれねえよ
それに良く使いまわす処理は俺ライブラリ化するなりコピペするなり
いちいち一から書かんだろ
0046デフォルトの名無しさん
2007/09/28(金) 18:19:580047デフォルトの名無しさん
2007/09/28(金) 18:22:42今はほとんどどの世界に行っても、言語仕様よりライブラリ覚える方が大変だよ
0048デフォルトの名無しさん
2007/09/28(金) 18:25:17file://の書き方は
file:///C:/foo.xmlであってるでしょうか?あまり詳しくないもので・・・。
フォルダのアドレスバーにfile://と入力して出てきたやつをそのまま使ってみました。
でも、やはりロードで失敗してしまいます。xmlファイル自体に問題があるか、MSXMLのバージョンの問題なのか・・・
0049デフォルトの名無しさん
2007/09/28(金) 18:26:47ファイルに問題があるかどうか切り分けたければ、URL越しでロードできた
ファイルをローカルに落として試せばいいだろ。
0050デフォルトの名無しさん
2007/09/28(金) 18:33:30Webからxmlファイル落としてローカルで試したところloadすることが出来ました。
どうやら自分のxmlファイルに問題があったようです。
xmlファイルの中身を見比べてみて原因を探ってみます。
0051デフォルトの名無しさん
2007/09/28(金) 18:33:49オープン系はそうですね
組み込みはそうでもなくて、純粋にC++に集中できそう
0052デフォルトの名無しさん
2007/09/28(金) 18:34:53SHCreateStreamOnFileでも使ってストリーム化したらどうだろう?
0053デフォルトの名無しさん
2007/09/28(金) 18:35:42自作のxmlはShift_JISで、正常に読み込める方のxmlはUTF-8で保存されたものでした。
なんでShift_JISでダメなのかはよく分かりませんが、とりあえずUTF-8で書くことでやっていきたいと思います。
ありがとうございました。
0054デフォルトの名無しさん
2007/09/28(金) 18:38:16Shift_JISは受け付けてくれると思う、MSXMLなら。
0055デフォルトの名無しさん
2007/09/28(金) 18:39:41既にC/C++の話題でも何でもないが
XMLファイルで↓のようにちゃんとエンコーディングは指定してるか?
<?xml version="1.0" encoding="Shift_JIS"?>
0056デフォルトの名無しさん
2007/09/28(金) 18:42:11XMLなんて言葉しか知らん
0057デフォルトの名無しさん
2007/09/28(金) 18:50:03HRESULTの判定をしてないのがいかんのだな。
その辺が出来ないなら raw_interfaces_onlyは使うなよ。
0058デフォルトの名無しさん
2007/09/28(金) 19:17:04対象のXMLファイルにはちゃんと
<?xml version="1.0" encoding="Shitf_JIS" ?>
と先頭に記述はしていました。ますます分からないですけど、
もしかしたら俺の環境がどこか特殊なのかもしれないので(または全然関係ないところのエラー)、
あまり悩まれない方がいいかもしれませんw
0059デフォルトの名無しさん
2007/09/28(金) 19:43:41MSXMLがちゃんとエラーメッセージが返してるからそれみりゃわかるって。
エラーメッセージの取り出し方わかってる?
0060デフォルトの名無しさん
2007/09/28(金) 19:50:46Shitf_JIS
しとふ・じす
0061デフォルトの名無しさん
2007/09/28(金) 20:01:36天才じゃね?
0062デフォルトの名無しさん
2007/09/28(金) 20:27:36こういう使い方は良くないと聞きました
どうしてですか?
だとしたら自分を壊して壁を壊すような処理はどこに書けばいいんですか?
よくわからなくなったので教えて下さい
0063デフォルトの名無しさん
2007/09/28(金) 21:07:08通報しますた
0064デフォルトの名無しさん
2007/09/28(金) 21:26:46ゲームのアイテムの話ですよ?
0065デフォルトの名無しさん
2007/09/28(金) 21:44:40理由:クラスの柔軟性が損なわれる
「インスタンスの破壊時に必ず呼ばれる」
→爆発させずに爆弾を消去するときも破壊判定させる気?
「デストラクタは引数とれない」
→わざわざ破壊対象の壁の情報を他のクラスに問い合わせるわけ?
それなら自分が爆発(explodeメソッド)するって情報だけ他のクラスに送って
それ以外の処理は他に任せるようにした方が責任の所在が明確になって
まだ良い設計になると思わない?
俺が思いつくのはとりあえずこんな所
0066682
2007/09/29(土) 00:47:46002.ppm
・
・
xyz.ppm
という内容のファイルリストからgetlineで画像名を読み込み、
それぞれの画像のカラーヒストグラムを書き出していくという
プログラムを作成しています。
一度に処理する画像枚数が約200枚までならば正常に動作するのですが、
一度に処理する画像が300枚前後になると、OSが急に固まりコンソールに
強制終了と表示されて、プログラムが終了してしまいます。
以下、メインのソースの一部
ifstream filelist
While(!filelist.getline(filename, sizeof(filename)).eof()) {
Image24 test_image;
ここらへんで様々な処理
}
この例の場合、ループでtest_imageが宣言される度に
デストラクタは呼び出されるのでしょうか?(デストラクタでメモリを解放する処理は書いてます)
長文ですがよろしくお願いします。
0067デフォルトの名無しさん
2007/09/29(土) 00:54:53デストラクタは呼ばれます。
実験してみりゃ一発なのに・・・
0068デフォルトの名無しさん
2007/09/29(土) 01:18:09とりあえずアップしてるソースの範囲は問題なし。
デストラクタの開放処理に漏れや誤りがあるか、
「ここらへんで様々な処理」 に問題があると思う。
LoadImageしてDeleteObjectしてないとか、LD_SHAREDしてるとか。
0070デフォルトの名無しさん
2007/09/29(土) 02:26:260071デフォルトの名無しさん
2007/09/29(土) 02:33:56C++なら(関数ではないが)std::ostringstream. boost::lexical_cast
0072デフォルトの名無しさん
2007/09/29(土) 02:41:400073デフォルトの名無しさん
2007/09/29(土) 20:18:04{
funcA();
funcB();
}
のようにstd::stringを拡張してstd::stringの機能をそのままに
文字列操作を行う関数を新たに追加したクラスを作りました
string_ex ex;
std::string str;
ex = str;
という操作を期待したのですがコンパイルエラーが出てしまいます
何か良い方法はありませんか?
0074デフォルトの名無しさん
2007/09/29(土) 20:51:030075デフォルトの名無しさん
2007/09/29(土) 20:55:57やめといた方がいいんじゃね
デストラクタも仮想じゃないし
0076デフォルトの名無しさん
2007/09/29(土) 21:06:33ありがとうございます
そうですか、スッキリして良いと思ったのですが残念です
0077デフォルトの名無しさん
2007/09/29(土) 21:08:52ただし、>>75の指摘通り使用に際しては注意が必要。
0078デフォルトの名無しさん
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のカオスさ加減をどうにかしたい気持はわからんでもないけど
0079デフォルトの名無しさん
2007/09/29(土) 21:32:11無理にメンバ関数にしないでフリーの文字操作関数にします
いろいろとありがとうございました
0080デフォルトの名無しさん
2007/09/29(土) 21:57:56コンストラクタ、代入演算子、あたりを全部作らないといけない上に、const / 非constの制御がかなり面倒。
でもやりたいよね…。ヘルパー作ってばっかだと、なんのためのオブジェクト指向か分からないし。
0081デフォルトの名無しさん
2007/09/29(土) 22:21:44仮想デストラクタを持たないstringやコンテナなどから
派生クラスを作る誘惑に負けるな by スコット・メイヤーズ
0082デフォルトの名無しさん
2007/09/30(日) 08:03:16main()
{
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);}
これでものすごい勢いでコンパイラエラー吐かれます><
初心者といううか見様見真似でつくったのでどこがだめかエラー見ただけじゃわからない
のでどこがおかしか教えてくださるとうれしいです
0083デフォルトの名無しさん
2007/09/30(日) 08:06:56+-/*という数値でないものを入力しようと言うのに
intという数値を扱う型で読み込もうとしているのがいけない。
bはchar型にし、%cで読み込めばいい。
そして、if (b == '/') {のようにする。
0084デフォルトの名無しさん
2007/09/30(日) 08:08:30intは数値だったんですか;
いろいろがんばってみます
0085デフォルトの名無しさん
2007/09/30(日) 08:11:390086デフォルトの名無しさん
2007/09/30(日) 10:06:21・コンパイルエラーがたくさん出ても焦るな。先頭の1つから順に消していけばいい。
・見よう見まねで作ったならエラー出て当然。まずはもう少し自分で理解する努力をしてから人に聞け。
・人に聞くなら、どんなエラーが出たのかぐらいは書くべき。
0087デフォルトの名無しさん
2007/09/30(日) 10:43:220088デフォルトの名無しさん
2007/09/30(日) 11:42:09みたいに前にアンダーバーを1つ2つ付けるのは
予約キーワードと衝突するおそれがあるので避けるべきらしいですが、
typeof_, typeof__
みたいに後ろに付けるならおkでしょうか?
0089デフォルトの名無しさん
2007/09/30(日) 12:23:070090デフォルトの名無しさん
2007/09/30(日) 12:49:51template<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>{};
としてもやはりダメでした。
0091(90)
2007/09/30(日) 12:50:520092(90)
2007/09/30(日) 13:03:41template<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の特殊化を狙っても
「テンプレート引数の数が少なすぎます」とダメでした。
0093デフォルトの名無しさん
2007/09/30(日) 13:04:35ヘッダをインクルードする時、ファイル名だけ指定してインクルードパスで検索する方法と、
インクルードパスを限定して、相対パスでファイルを指定する方法とではどちらが一般的でしょうか?
ヘッダが100近いフォルダに散在していると前者と後者のどちらを適用すべきか判断がつきません。
他のプロジェクトで類似するケースではどのようにしているのか聞いてみたいんですが。
ちなみにヘッダファイルの移動はないことを前提としています。
0094デフォルトの名無しさん
2007/09/30(日) 13:04:48(処理)
return 0;
}
何で0を返すんですか?
1ではダメなのですか?
0095デフォルトの名無しさん
2007/09/30(日) 13:20:19いいよ〜
終了コードの使い方は処理系依存だけど、一般的には
0が正常終了、エラーや警告があれば1以上の数字を返すのが慣例。
0096デフォルトの名無しさん
2007/09/30(日) 13:25:37gcc 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();
}
0097デフォルトの名無しさん
2007/09/30(日) 13:48:55適材適所。
そのたくさんのディレクトリが相互に無関係ならそれぞれパス指定するしかないと思う。
そうではなく、ある程度共通のディレクトリの中に分散しているのなら、共通部をパス指定して
残りはファイル名で記述すればいいだろう。
例えば、こんな感じ。
--
/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を追加。
0098デフォルトの名無しさん
2007/09/30(日) 14:07:02コンパイラは何を使っている。
また、そもそも何をしたい?それ次第では別の手段があるかもしれない。
0099デフォルトの名無しさん
2007/09/30(日) 14:16:00#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;
}
0100デフォルトの名無しさん
2007/09/30(日) 14:18:29コンパイラさえ問題なく、しかもrがvoid型なら、
<t, void (t::*)(arg)>なんて特殊化は
不要だと思ったのだが違うのか?
0101デフォルトの名無しさん
2007/09/30(日) 14:20:32インクルードパスにはあまりごちゃごちゃ含ませないことが望ましい。
インクルードパスに含まれるヘッダの名前は実質システムグローバルだからな。
行儀のいいやりかたは、>>97のように、インクルードパス直下にヘッダを
置かず、モジュールだのライブラリだの用のディレクトリを掘り、その下に
ヘッダを入れることだ。
そうすることで、汚染する名前をディレクトリ名だけに限定でき、
名前の衝突を回避しやすくなる。
勿論、これにはインクルードパスの下をあまりとっちらからせずに、整理整頓できる
というメリットもある。
■ このスレッドは過去ログ倉庫に格納されています