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

Boostを語れゴラァ part3

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん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/ ;
0153デフォルトの名無しさん2006/10/20(金) 22:03:06
腐ったコンパイラでなんとかしようという努力は不毛だぜ
0154デフォルトの名無しさん2006/10/20(金) 22:38:40
>>152
そもそも一時オブジェクトをswapの引数にはできん
0155デフォルトの名無しさん2006/10/20(金) 23:17:36
>>154
--->?swap技法?
0156デフォルトの名無しさん2006/10/21(土) 00:24:57
中国人は帰れよ
0157デフォルトの名無しさん2006/10/21(土) 00:43:07
>>155
意味不明
0158デフォルトの名無しさん2006/10/21(土) 00:43:28
>>154
vectorが確保するメモリを要素数ぴったりに合わせるテクニックで
x.swap(std::vector<T>(x));
ってのがあったと思うけど、これもダメなの?
0159デフォルトの名無しさん2006/10/21(土) 00:46:06
一時オブジェクトをswapの引数にするのは何も問題ない(ちゃんとしたコンパイラなら)
0160デフォルトの名無しさん2006/10/21(土) 00:50:03
constでない参照引数に一時オブジェクトはダメじゃなかったっけ?
0161デフォルトの名無しさん2006/10/21(土) 01:01:03
>>158
VC++2003で警告レベルを最高にするとwarningになるな。
0162デフォルトの名無しさん2006/10/21(土) 01:27:59
23.1 Container requirementsによればa.swap(b)とswap(a,b)は同じで、
25.2.2 Swapによれば
template<class T> void swap(T& a, T& b);
1 Requires: Type T is Assignable.
とあるから、できないんじゃね?
と思ってx.swap(std::vector<T>(x));とやったらVC++2005でエラーになった。
と思ったらstd::vector<int>(x).swap(x);は通った。
何じゃこりゃ。
0163デフォルトの名無しさん2006/10/21(土) 02:05:58
>>158
swap技法はstd::vector<T>(x).swap(x);じゃない?
0164デフォルトの名無しさん2006/10/21(土) 07:43:54
>>162
template<class T> void swap(T& a, T& b);
はaもbも非const参照だから、一時オブジェクトを受け付けない。

std::vector<int>(x).swap(x);は、
std::vector<int>(x)が一時オブジェクトだが非constなので、非constなメンバ関数を呼べてしまう。
0165デフォルトの名無しさん2006/10/21(土) 08:54:42
>>158
お前何にもわかってないのな

>>159
馬鹿確定
0166デフォルトの名無しさん2006/10/21(土) 10:01:26
あ、一時オブジェクトに対して非constメンバを呼ぶのはいいのか。
0167デフォルトの名無しさん2006/10/21(土) 21:13:06
int add(int a,int b){return a+b;} があるとして、
boost::function<int (int,int)> f = add; はコンパイルできるわけですが、

boost::function<boost::function<int,int> (int)> g = add; のようなことがしたい場合はどうし
たらよいでしょうか?addを、int->int->int ではなく int-> (int->int) として扱いたいというか。

gに、あとで(addの)第一引数を渡して、boost::function<int,int>型の関数オブジェクトを得て、
更にその後で(addの)第二引数を渡し、最終結果を得たいという感じです。
01681672006/10/21(土) 21:20:16
fをgに変換する方法でも結構です。
よろしくおながいします
0169デフォルトの名無しさん2006/10/21(土) 21:44:22
>>167
どうしてもその変換をしないと駄目?
第一引数が既にあるならそれを部分適用することは簡単なんだが。
0170デフォルトの名無しさん2006/10/21(土) 22:05:03
思った程大変じゃなかった。

# include <boost/function.hpp>
# include <boost/lambda/lambda.hpp>
# include <boost/lambda/bind.hpp>
# include <iostream>
# include <functional>

namespace lam = boost::lambda;

int main(void)
{
  typedef boost::function<int (int, int)> f_type;
  f_type f = std::plus<int>();
  boost::function<boost::function<int (int)> (int) >
    g = lam::bind(std::bind1st<f_type, int>, f, lam::_1);
  std::cout << g(7)(2) << '\n';
}
01711672006/10/21(土) 22:05:15
>>169
第一引数の部分適用が簡単なのは承知しているのですが…変換希望です。

01721672006/10/21(土) 22:23:29
>170
ありがとうございます。やってみます。
0173デフォルトの名無しさん2006/10/21(土) 23:04:05
boost::bindでもいけるね
0174デフォルトの名無しさん2006/10/21(土) 23:10:30
>>173
いってみてよ
0175デフォルトの名無しさん2006/10/22(日) 01:05:59
template <typename A, typename B, typename C> int foo(A a, B b, C c) { return 0; }
template <typename A, typename B> int foo(A a, B b) { return 0; }
に対して、後者の関数をbindするつもりで
boost::bind(foo<int,int>, _1, 100);
すると、no matching function for call to ‘bind(<unresolved overloaded function type>, boost::arg<1>&, int)’
とか言われてしまうんだが、これって回避策ありますか?

gcc4.1です
0176デフォルトの名無しさん2006/10/22(日) 01:12:24
>>175
boost::bind(static_cast<int (*)(int, int)>(foo), _1, 100)
0177デフォルトの名無しさん2006/10/22(日) 12:38:25
>>175
class Void{}Void_v;
template<class T1, class T2, class T3=Void>struct select_f;
の特殊化を作ってfooの引数にVoid型があるなしで選択するとかは。
0178デフォルトの名無しさん2006/10/22(日) 12:42:09
>>177
は?
0179デフォルトの名無しさん2006/10/22(日) 12:43:22
>>177
175は関数テンプレートな訳だが..
01801772006/10/22(日) 13:30:36
>>179
えーと、あいまいな関数オーバーロードの解決にはキャストあたりが手っ取り早いと思うけど
そこで、
template <typename A, typename B, typename C>
int foo(A a, B b, C c) { return select_f<A, B, C>()(a, b, c); }// put away foo else
・・・
boost::bind(foo<int,int, Void>, _1, 100, Void_v);
こんな感じでキャストを使わない方法の案を提供したかったわけですよ。
0181デフォルトの名無しさん2006/10/22(日) 13:39:27
キャストを使わないでそれを使うことに何の意味があるの?

あと、>177のように何の前置きにもなしに言って、理解してくれるエスパーだと思ったの?
01821772006/10/22(日) 13:55:49
>>181
キャストを使わない。
キャストを使ったときに起きるテンプレート関数の特殊化に対しての曖昧性をなくせる(たぶん)。

> あと、>177のように何の前置きにもなしに言って、理解してくれるエスパーだと思ったの?
タイピングの勢いだ。
0183デフォルトの名無しさん2006/10/22(日) 14:28:28
> キャストを使ったときに起きるテンプレート関数の特殊化に対しての曖昧性
具体例が欲しいな
0184デフォルトの名無しさん2006/10/22(日) 15:58:19
boost::lambdaのunlambdaとprotectがよくわからないんだぜ

0185デフォルトの名無しさん2006/10/22(日) 16:38:15
>>183
たとえば、>175を
template <typename A, typename B> int foo(A a, B b); (b)
template<class A, class B>int foo(A*,B*); (c)
こんな(c)を追加して、(c)or(b)のどちらかをbindで使いたい場合
このオーバーロードの解決には結局、関数オブジェクトが手っ取り早いと思います。
0186デフォルトの名無しさん2006/10/22(日) 17:13:50
>>185
それ、曖昧か?
後者は foo() についてポインタ型を扱う場合の特殊化を宣言しているので、
引数の型に応じて定義が使い分けられるだけじゃないの?

↓キャストでもコンパイルできたし。

int a, b;
(static_cast<int (*)(int*, int*)>(foo))(&a, &b);
01871852006/10/22(日) 17:59:14
>>186
boost::bindは?
0188デフォルトの名無しさん2006/10/22(日) 18:02:01
>>187
boost::bind(static_cast<int (*)(int*, int*)>(foo), _1, &b)(&a);
これぐらい自分で補完しろよ。
0189デフォルトの名無しさん2006/10/22(日) 18:35:54
>>188
コンパイル出来るんだ。へぇー。
0190デフォルトの名無しさん2006/10/22(日) 19:04:01
がんばって早く「ごめんなさい」の言える大人になろーね。
0191デフォルトの名無しさん2006/10/22(日) 19:23:43
ごめんなさい
0192デフォルトの名無しさん2006/10/22(日) 19:40:14
>>190
だって食い下がって逆撫でしていれば
>>188みたいな知識ひけらかし大好き君が無償で色々書いてくれるんだもん。
こういう子は利用しない手はないって。
0193デフォルトの名無しさん2006/10/22(日) 19:57:34
>>192
普通に質問すればいいのに、なんでわざわざそんな手段をとる必要がある?
0194デフォルトの名無しさん2006/10/22(日) 20:19:00
回答をもらえる確率が上がるから。
0195デフォルトの名無しさん2006/10/22(日) 20:25:02
まぁ、スレを客観的に眺めると、知識ひけらかし大好き君は>177と分かるんだけどね。
>176で終わってる質問だし。

それに>188の知識は>176以上のものではないし。
散々引っ張っといて同じモノしか出ないんじゃ、割に合わない。

単純に悔しくなった>177君が利用してやった振りしてるだけ。
0196デフォルトの名無しさん2006/10/22(日) 20:47:18
>>182 に「たぶん」って書いてあるのは、ただの妄想ってことでいいの?
01971892006/10/22(日) 23:35:55
>>188
ごめん。
だれもつっこんでくれないから寝る前に一言
> boost::bind(static_cast<int (*)(int*, int*)>(foo), _1, &b)(&a);
ちょっと言い訳・・・・「&a」参照の罠に嵌ってました。以上です。では、おやすみ。
0198デフォルトの名無しさん2006/10/25(水) 18:14:32
std::map みたいに扱えて、実はバックエンドがデータベースだなんて
すてきな使い心地のライブラリって無いものでしょうか。
0199デフォルトの名無しさん2006/10/25(水) 19:42:34
boost::graph
と
ASLの adobe::forest
が車輪の再発明ぽい点について
0200デフォルトの名無しさん2006/10/25(水) 20:28:36
ASL かわいいよ ASL
0201デフォルトの名無しさん2006/10/25(水) 23:26:50
あるあ…(ry >198
0202デフォルトの名無しさん2006/10/26(木) 00:02:53
>>201 あるんですか?
なんて言うライブラリか教えて貰えませんか?
今、std::map を boost::serialization でディスクに書き出しているんですが、
かなりデータ量が大きくなってきて、すべてをオンメモリで処理するのが
苦しくなってきました。
0203デフォルトの名無しさん2006/10/26(木) 03:11:33
AllegroCache. これ最強。
0204デフォルトの名無しさん2006/10/26(木) 09:38:05
boostいいね。使っているとスルメみたいに味わい深いわ。
しかし古い設計で組んでいた俺の昔のコードは一体何だったんだと。 orz
0205デフォルトの名無しさん2006/10/26(木) 11:07:28
STLぽい数式処理と数値計算のできるライブラリーってないでしょうか?
せめて多項式か2次式だけでもできると
少し数値計算プログラムが楽になる
0206デフォルトの名無しさん2006/10/26(木) 15:38:08
ASLの
adobe::dictionary_t
はstd::mapよりたくさん要素あつかえるとかtutorialに書いてあった
0207デフォルトの名無しさん2006/10/26(木) 16:19:02
>>198
Berkeley DBでも使え。
02082012006/10/27(金) 00:43:04
ねーよ
0209デフォルトの名無しさん2006/10/27(金) 08:40:10
>>201>>208
馬鹿?
0210デフォルトの名無しさん2006/10/27(金) 11:05:09
>>198
つlibstldb4
0211デフォルトの名無しさん2006/10/27(金) 16:20:16
>>198
なぜ boost スレへ?
0212デフォルトの名無しさん2006/10/27(金) 20:13:30
std::plus()はreturn a+b;ですが、return a+=b;してくれる関数オブジェクトは無いでしょうか?
手前で作ればいいのですが、boostにあるならそっちをつかいたく。
0213デフォルトの名無しさん2006/10/27(金) 20:57:59
_1 += _2
0214デフォルトの名無しさん2006/10/27(金) 21:06:44
>213
それはコンパイルできんだろ..
0215デフォルトの名無しさん2006/10/27(金) 21:11:33
class MyPlus : public std::plus,
boost::addable< point<T>
, boost::subtractable< point<T>
>
{
MyPlus operator+=(const MyPlus&);
};

でいけたらいいな
0216デフォルトの名無しさん2006/10/27(金) 21:16:44
>>214
using namespace boost::lambda;
0217デフォルトの名無しさん2006/10/27(金) 21:23:35
std::accumulate は?
02182172006/10/27(金) 21:25:48
あ、関数オブジェクトじゃなかったorz
0219デフォルトの名無しさん2006/10/27(金) 21:30:13
>>216 +=はオーバーロードされていないと思うが。
0220デフォルトの名無しさん2006/10/27(金) 21:38:25
んなあほな。
複合代入演算子はクラスの外からでも多重定義できるのだから、
boost::lambdaで使えないわけが無い。
0221デフォルトの名無しさん2006/10/27(金) 21:42:58
+=は使える。
クラス外から多重定義できるかどうかは関係ないような。
02222122006/10/27(金) 21:51:39
>>213
できました。ありがとう
0223デフォルトの名無しさん2006/10/27(金) 21:52:36
そうか、_1なんかはそれ自身ラムダオブジェクトだったな。
0224デフォルトの名無しさん2006/10/27(金) 23:28:35
>>219
死ねカス
0225デフォルトの名無しさん2006/10/30(月) 18:40:49
話題が無いな
0226デフォルトの名無しさん2006/10/30(月) 18:54:49
話題ねぇ…

http://opensource.adobe.com/gil/

今レビューされている、Generic Image Library が通れば、
各種画像サポートが実現されるわけで、非常に期待してる。
0227デフォルトの名無しさん2006/10/30(月) 20:09:51
ほお adobeがopensourceとは..
0228デフォルトの名無しさん2006/10/30(月) 22:09:56
通ればってどういうこと?
0229デフォルトの名無しさん2006/10/30(月) 22:14:22
ttp://lists.boost.org/Archives/boost/2006/10/111131.php

ちうこと。
0230デフォルトの名無しさん2006/10/30(月) 22:29:06
adobe ASLで
http://japan.zdnet.com/news/devsys/story/0,2000056182,20082134,00.htm
ユーザーインターフェイスの自動生成?
本当にできるの?
0231デフォルトの名無しさん2006/10/30(月) 22:31:59
なぜvigraじゃなくてgilなんだ
機能の豊富さからいったらvigraが上だろう
http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/
0232デフォルトの名無しさん2006/10/30(月) 22:42:28
>>231
作者がboostに提案したか否かだろ
0233デフォルトの名無しさん2006/10/30(月) 23:51:16
>>230
発表された頃に斜め読みした限りでは
プログラマとデザイナで仕事を分離するという程度の内容だったような?
0234デフォルトの名無しさん2006/10/31(火) 01:39:42
>>232
どの記事だったか忘れたけど

>vigraのほうが好きだけど,vigraは作者が一人だし、gilが採択されたら
>その作者がんばるだろうからいいじゃん
とか書いてあった
02352342006/10/31(火) 01:41:27
>>234
http://lists.boost.org/Archives/boost/2006/10/112316.php
これこれ
0236デフォルトの名無しさん2006/10/31(火) 03:07:04
やる気のない実装を見るとRejectされそうだけどな
0237デフォルトの名無しさん2006/10/31(火) 12:11:48
http://lists.boost.org/Archives/boost/2006/10/112534.php
VC7.1でコンパイルとおらねえじゃねえかよ
同じとこでこけやがる
0238デフォルトの名無しさん2006/10/31(火) 18:46:57
LinuxのGCCでワイド文字全般がうまく機能しないです。
gcc3.3.6
libstdc++3.3.6

boostでなんとかなりませんか?

wcout << L"てれれのレ";
[****@ **] (沈黙)
0239デフォルトの名無しさん2006/10/31(火) 18:51:43
端末の文字コードが間違っているなんてこと無いよね?
0240デフォルトの名無しさん2006/10/31(火) 19:18:04
ないです。
0241デフォルトの名無しさん2006/10/31(火) 19:24:22
出力をパイプでod -tx1に流して16進で見ても、やはり

[****@ **]./a.out | od -tx1
0000000 (沈黙)
0242デフォルトの名無しさん2006/10/31(火) 19:41:44
http://pc8.2ch.net/test/read.cgi/tech/1143375639/294-304
これと同じ問題?
0243デフォルトの名無しさん2006/10/31(火) 19:52:16
gccのバージョン上げろ
0244デフォルトの名無しさん2006/10/31(火) 20:25:51
つまり L をコンパイラがまともに処理してくれていない?
0245デフォルトの名無しさん2006/10/31(火) 20:58:26
そうだよ。-Sでアセンブラ出力みてみ。
0246デフォルトの名無しさん2006/10/31(火) 21:14:59
バージョンの問題なのか?
0247デフォルトの名無しさん2006/10/31(火) 21:39:46
>>2.4.6
--input-charsetが3.4からだから、そうだと思うんだけど。
0248デフォルトの名無しさん2006/10/31(火) 21:40:21
あかん、アンカーがorz
0249デフォルトの名無しさん2006/10/31(火) 23:02:31
>>248 誰がうまいこと言えと
0250デフォルトの名無しさん2006/11/01(水) 01:37:53
function<int (int)> hohe(int x)
{
return boost::lambda::_1 +x;
}
でxを延命させるうまい方法はありますか? 別途関数を作ってbindとか、
plus<int>()にbindあたりはナシで。
0251デフォルトの名無しさん2006/11/01(水) 01:48:57
>>250
延命も何も、λ式に保持されるのはその時点でのxの値で、
xへの参照ではないから、xの寿命を気にする必要はない。
0252デフォルトの名無しさん2006/11/01(水) 04:26:38
gcc3.4 gcc4.0.2で試したらワイド文字関係がすこぶる正常。
結局バージョンの問題か。
■ このスレッドは過去ログ倉庫に格納されています