5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Boostを語れゴラァ part3

1 :デフォルトの名無しさん:2006/09/23(土) 15:00:11
語って.はぁと part boost::mpl::int_<3> 

前スレ
part 2 http://pc8.2ch.net/test/read.cgi/tech/1139313234/
part 1 http://pc8.2ch.net/test/read.cgi/tech/1091198276/

■関連サイト■ 
Boost C++ Libraries 
http://www.boost.org/ 

Boost 翻訳プロジェクト 
http://boost.cppll.jp/HEAD/ 

Let's Boost 
http://www.kmonos.net/alang/boost/ 

boost info 
http://shinh.skr.jp/boost/ 

483 :デフォルトの名無しさん:2006/12/19(火) 19:52:06
すみません、質問させてください
基本型あるいはユーザ定義型の配列の要素数を返す関数を作ろうとしてるんですが
arrayがユーザ定義型の配列であった場合でも
/* @ */の処理がコンパイルされるためエラーになってしまいます

template <typename T> void count(T array[]){
if(boost::is_pod<T>::value){/* @ */}
else{/* A */}}

WEBで調べているとboost::enable_ifで解決できそうな予感がしたのですが
自分には次の例がよく理解できません(特に::type*=0の部分)
これはどういった理屈で動いているんでしょうか

template<typename T> void copy_n( const T* from, int n, T* to,
typename enable_if< is_pod<T> >::type* =0 ){/* 省略 */}

484 :デフォルトの名無しさん:2006/12/19(火) 20:09:40
>>483
enable_ifやdisable_ifは、関数のオーバーロード解決のルールをトリッキーに使っている。

やりたいことを実現する方法はいくつかある。
たとえばこんな方法。

//false以外、すなわちtrueの場合に呼ばれる
template < bool isPod >
struct Count_impl
{ static void do() {/* 1 */} } ;

//特殊化、falseの時に呼ばれる
template < >
struct Count_impl<false>
{ static void do() {/* 2 */} } ;

template < typename T >
void count(T array[])
{
 Count_impl<boost::is_pod<T>::value>::do() ;
}

485 :デフォルトの名無しさん:2006/12/19(火) 20:11:15
>>483
enable_if<is_pod<T> >
には、TがPODならtypeメンバがあり、そうでなければtypeメンバがない。
したがって、TがPODでないとき、typename enable_if<is_pod<T> >::typeは
不正な型であり、SFINAE規則によってこの定義が多重定義の考慮から外される。
結果として、TがPODであるときのみ考慮される定義ができたわけだ。
typename enable_if<is_pod<T> >::typeは、このコンパイル時選択の機構のためだけに
使われているので、インタフェースに影響を与えないようにデフォルト値付きの引数になっている。
ポインタを取っているのは簡潔に0で初期化できるようにだろう。

486 :483:2006/12/19(火) 21:31:23
>>484,485
レス感謝です
おかげさまで理解できました

>>484
こういう風にすればenable_ifなしでいけるんですね
なんとかそのプログラム理解はできても
自分で書けるようになるまでが大変だ・・
とりあえずこれを参考に頑張ってみます

>>485
enable_if< is_pod<T> >::type* =0
ええと、この式の場合だと
組み込み型の場合はtypeメンバが存在するわけですよね
そして組み込み型でない場合はtypeがないから定義自体されない
それだと* =0はなくても大丈夫なんじゃ?と思ったけど
この引数はコンパイル時にifの役割を果たせばよいから省略可能にしたい
省略可能にするには=とデフォルト引数が必要で
typeをtype*にすればどんな場合でも0が代入できる
うーむ、よく考えられてますね

487 :デフォルトの名無しさん:2006/12/19(火) 22:46:08
個人的には返り値型に使うほうが好き>enable_if

488 :デフォルトの名無しさん:2006/12/20(水) 01:12:34
>>482
自分で「おそらくSPAMの一種だと思う」なら、ちゃんと見分けられてるじゃないか。

489 :デフォルトの名無しさん:2006/12/20(水) 03:58:16
>>487
コンストラクタだとデフォルト引数として仕掛けるしかないけれどね

逆に引数の数が固定されていて余計なデフォルト引数が仕掛けられない
演算子関数定義だと戻り値型一択になるね

490 :デフォルトの名無しさん:2006/12/20(水) 20:21:16
そもそも483が作ろうとしていると言う配列の要素数を返す関数は、
基本型かユーザ定義型かで分けて一体何をするのか気になる。

配列の要素数と言えばそもそもboost::size()で済むような話ではないのか?

491 :デフォルトの名無しさん:2006/12/20(水) 20:32:25
>>490
番兵を思いついた。
podな型に対しては、ある値を決めておき、
俺様クラスについては、専用のフラグでも用意しているとか。

492 :デフォルトの名無しさん:2006/12/21(木) 16:05:56
boost開発者向けMLに、自分用に作った
プログラム(boostの既存libの部品の追加してるだけだけど)、
死蔵するのもったいないから
ときどき投稿してたんだけど、
最近、無視されてるっぽい。

493 :デフォルトの名無しさん:2006/12/21(木) 17:41:27
boost使いはVS2005にSP1はあてるのかい?

494 :デフォルトの名無しさん:2006/12/21(木) 17:56:40
当たり前だ

495 :デフォルトの名無しさん:2006/12/21(木) 21:36:36
>>492
何か不満か? ML に晒したんなら勝手に使ってる奴もいるだろう。
使った人が必ずレスポンスを返すわけでもなし。
死蔵にはならずに済んだんだからいいだろ。

496 :デフォルトの名無しさん:2006/12/21(木) 22:52:25
boost.cppll.jp 落ちてる?

497 :デフォルトの名無しさん:2006/12/21(木) 23:29:55
ぽいね。俺も繋げない

498 :デフォルトの名無しさん:2006/12/22(金) 11:42:53
ublasのatlasへのインターフェイスをbackendと表現してるのだが
backendってそういう意味なんだっけ?

499 :デフォルトの名無しさん:2006/12/22(金) 12:01:23
まあCORBAとDCOMではproxy/stubが逆転していることですし

500 :デフォルトの名無しさん:2006/12/22(金) 15:15:00
>>499
それは主体をどっちに置くかという話から帰着した結果だからあんまり関係ない気が。


501 :デフォルトの名無しさん:2006/12/22(金) 23:08:58
atlasは下請けや補完をやるわけだから、
ublasから見ればたくさんあるbackendの一つってことでしょ。

502 :デフォルトの名無しさん:2006/12/24(日) 12:39:36
boostの日本語ドキュメントプロジェクトって2003年で更新止まってるよね
サーバーも落ちてるみたいだけど、誰もメンテナンスしてないの?

503 :デフォルトの名無しさん:2006/12/24(日) 17:51:43
ublas今試してるんだけど、
VC++2005でboost1.33_1だとsparse_matrixとsparse_vectorは定義されていないと怒られてしまう。
matrix_sparse.hppとvector_sparse.hppはきちんとインクルードしているんだけど、なぜに?


504 :デフォルトの名無しさん:2006/12/24(日) 18:41:52
しかも、mat[i][j]とかで行列の要素にアクセスするとか、lu_factorizeもコンパイルエラー。なんでやろ・・・。

505 :デフォルトの名無しさん:2006/12/24(日) 18:49:16
エラーメッセージも張らずに日記かよ。いい加減にしろ

506 :デフォルトの名無しさん:2006/12/25(月) 13:27:53
>>504
mat[i][j]の書き方はできなくなった
今は
mat(i,j)


507 :デフォルトの名無しさん:2006/12/25(月) 13:47:21
Boost.Python でPythonから呼ぶようにした関数って
Cとして呼ぶよりも処理が遅くなったりするの?


508 :デフォルトの名無しさん:2006/12/26(火) 16:16:15
すみませんが、質問です。
Debian Sarge(EUC-JP)上でBoostのsplitなどをを使いたいのですが、ソースコー
ドの文字列をEUC-JPにするとエラーになってしまいます。

#include <boost/algorithm/string.hpp> を含むソースで
g++-3.4 -finput-charset=EUC-JP -fexec-charset=EUC-JP test05.cpp -o test05
を実行すると、
/usr/include/boost/function/function_base.hpp:23:25: failure to convert EUC-JP to UTF-8
このようなエラーに。
なお、ソースではwchar_t, wstringを使っています。

ソースをUTF-8に、オプションを-finput-charset=UTF-8 にすると動くように
なりますが、やはりこれは不便です。

ソースをEUC-JPのままで使う方法はないでしょうか?


509 :デフォルトの名無しさん:2006/12/26(火) 18:55:42
age

510 :508:2006/12/26(火) 19:42:26
追記です。
コンパイル時のエラーは、こんな単純なソースでも起こってしまいます。
エラー再現には、ソースにワイド文字リテラルが含まれる必要はありません。
------------------
#include <boost/algorithm/string.hpp>

int main(void)
{
return 0;
}
------------------
g++-3.4 -finput-charset=EUC-JP -fexec-charset=EUC-JP test06.cpp -o test06

/usr/include/boost/function/function_base.hpp:23:25: failure to convert EUC-JP \to UTF-8

EUC-JPではマルチバイト文字を使えということなのかもしれませんが、せっかく
対応しているのだからワイド文字を使いたいのです。


511 :デフォルトの名無しさん:2006/12/26(火) 19:56:55
>>510
boost/ref.hppがLatin-1で書かれているのが問題っぽいな。
ASCIIに直すようにお願いする位しか解決策が思いつかないが。

512 :508:2006/12/26(火) 20:20:55
>>511
ありがとうございます。
ref.hppの17行目でしょうか?そこを削除しても、やはり同じエラーが出ます。

他に気づいたことは、-finput-charset=utf8 などと書いても、「UTF-8に変換
できない」というエラーになることです。大文字ハイフン入りの「UTF-8」以外
受け付けません。

もしかしたらGCC自体が、テンプレートライブラリがUTF-8以外であることに対応
していないのでしょうか?


513 :デフォルトの名無しさん:2006/12/26(火) 20:38:10
>>508
この辺を参考に
http://search.gmane.org/?query=windows+unicode+gcc&group=gmane.comp.gcc.devel
http://permalink.gmane.org/gmane.comp.gcc.devel/78542

>>512
インクルードファイルの中に他にも含まれていないか
チェック。utility/enable_if.hpp とか

$ iconv -l

で使用できる文字コードは分かる

514 :508:2006/12/26(火) 21:08:11
>>513
ありがとうございます。よく読んでいませんが、結局コードの変換ルールが問
題ということでしょうか。

grep -r Jaakko /usr/include/boost/

これで検索したところ66件ありました。他にもlatin-1の名前はあるかもしれ
ません。さすがに直す気が失せました。

とりあえず、コンパイル前にiconvをかけることにします。いずれはUTF-8環境
に移行した方が良さそうです。


515 :508:2006/12/27(水) 00:25:09
http://permalink.gmane.org/gmane.comp.gcc.devel/78542
を読んで思ったのですが、どうやらUTF-8にすれば完全解決というわけではな
いようですね。

g++ -finput-charset=EUC-JP

こう書くと、GCCはソースファイルを、includeされるヘッダライブラリまです
べてEUC-JPだとみなします。そしてそれを libiconv で UTF-8 に変換しよう
とします。このとき(ヘッダファイルに)EUC-JPに含まれない文字コード
(Latin-1など)があったらエラーになってしまいます。

g++ -finput-charset=UTF-8 (または-finput_charsetの指定なし)

こう書くと、GCCはソースファイルを、includeされるヘッダライブラリまです
べてUTF-8だとみなします。しかし今度は変換の必要がないので、libiconv は
呼ばれません。ヘッダライブラリも変換されません。

これで通常は問題はなくなるわけです。しかし、

・ヘッダライブラリのエンコーディングがUTF-8でない。
・ヘッダライブラリに wcha_tのリテラルがある。

(あまりないでしょうが、)この2つが同時に起こると、ライブラリは正しく
動作しません。

結局、すべてのヘッダファイルがUTF-8で統一されるか、Pythonのように各ソー
スファイルにエンコーディングの宣言ができるようにしないと、完全解決とは
言えないようです。いずれも一ユーザにはどうしようもない話ですが。

Boostとあんまり関係なくてすみません。

516 :デフォルトの名無しさん:2006/12/27(水) 13:04:16
初心者的質問で申し訳ありません。
>>391でインストールするとき、最初に
default variantsを選んでください
って言われて、
Multithred Debug, DLL
Multithred, DLL
Multithred
Multithred, static runtime
Multithred, Debug, static runtime
Single thred, static runtime
Single thred, Debug, static runtime
の中から選択させられるんですが、ノーパソ用ペンティアム3(1.13GHz)とノースウッドコアペンティアム4(3.2Ghz)
の場合、どれを選べばいいんでしょうか。
マルチスレッデッィングとシングルスレッディング用CPUの違いくらいしか分からないので・・・

517 :デフォルトの名無しさん:2006/12/27(水) 14:35:53
Multithred/Single thredはCPUの問題じゃない


518 :デフォルトの名無しさん:2006/12/27(水) 14:36:53
boostにはデバッグは特にいらないと思う。かなりでかくなるから。
DLLにするかどうかだけど、初心者ならスタティックでいいと思う。
あとはスレッドを利用するならマルチスレッド、しないならシングルスレッド。
シングルスレッドで速度を追求するならシングルスレッドだけど
通常はマルチスレッドでいいと思う。

519 :デフォルトの名無しさん:2006/12/27(水) 14:37:16
thred?

520 :518:2006/12/27(水) 14:37:42
訂正
×特に ○別に

521 :516:2006/12/27(水) 14:45:12
ありがとうございます。
ではとりあえず
Multithred, static runtime
でインストールして使ってみます。
なお、参考までにお聞きしたいのですが、DLLにするとどういった使い方が可能になるのですか?

522 :デフォルトの名無しさん:2006/12/27(水) 14:49:20
templateなlibraryにDLLもくそもないから気にするな。

523 :デフォルトの名無しさん:2006/12/27(水) 15:11:02
>>521
DLLの特長はここに書いてある。
http://e-words.jp/w/DLL.html
必要ならDLLを選ぶといいと思う。

524 :デフォルトの名無しさん:2006/12/27(水) 16:19:19
vc2005 sp1の現状

std;;wstring s = L"漢字";
// std::wcout << s << std::endl; //←ここをコメントアウトすると何もでなくなる
std::wcout.imbue(std::locale("japanese")
std::wcout << s << std::endl; //←出る
std::locale::global(std::locale("C"));
std::wcout << s << std::endl; //←出る

よくわかんないけどMSの開発担当者はもっとまともなロケール実装者が来るまで正座な。


525 :デフォルトの名無しさん:2006/12/27(水) 16:22:23
boostとは直接関係ないけど、これ直ってないのか。なんのためのSPなんだか('A`)

526 :デフォルトの名無しさん:2006/12/27(水) 20:10:24
>>524
とりあえずSTLport使っとくとlocale::globalの後に
それぞれimbueすればちゃんと動くらしいよ。
付属のだとそれすら効かない。

std::locale loc("japanese");
std::locale::global(loc);
std::wcout.imbue(loc);
std::wcout << L"ぶーすと" << std::endl;

527 :デフォルトの名無しさん:2006/12/27(水) 23:15:10
ublasでrankは求められなかとですかい?
rank求めるのにlu分解は精度の問題で、一般には使われてないとか書いてるけど、
どの程度精度に問題でてくるんだろうね。

528 :デフォルトの名無しさん:2006/12/28(木) 12:41:32
ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.htmlを参考にして
ublasで逆行列を求めようとしているのですが、lu_factorizeの呼び出しでコンパイルエラーになります。
エラーメッセージが大量なので、ソースと一緒にアップローダに上げておきます。
ttp://zetubou.mine.nu/itoshiki/nozomu/zetubou3677.zip

529 :デフォルトの名無しさん:2006/12/28(木) 13:06:13
実行時エラーなら出るがコンパイルエラーは出ないな。
VC8SP1 + Boostは11月の頭にCVSから

F:\>cl -nologo -EHsc -ID:\Boost inv.cpp
inv.cpp

F:\>inv.exe
Check failed in file D:\Boost\boost/numeric/ublas/triangular.hpp at line 2435:
e1 () (n, n) != value_type ()

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

F:\>


530 :デフォルトの名無しさん:2006/12/28(木) 15:50:10
November 28, 2006 - Function Types Accepted

531 :デフォルトの名無しさん:2006/12/29(金) 19:50:03
VC7 でserializationのlib出きへんのやけど
なんか必要?

532 :528:2006/12/29(金) 20:29:50
boostを1.32.0に入れ替えてみたところコンパイル出来ました。
実行時エラーは、おそらく係数行列を適当に設定したため発生したのだと思います。
係数行列を参考サイトと同じ行列にしたところ、同様の結果が得られました。
ublas使う時だけ1.32.0で行くことにします。ありがとうございました。

119 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)