[過去ログ] Boostを語れゴラァ part3 (1001レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
154
(2): 2006/10/20(金)22:38 AAS
>>152
そもそも一時オブジェクトをswapの引数にはできん
155
(1): 2006/10/20(金)23:17 AAS
>>154
--->?swap技法?
156: 2006/10/21(土)00:24 AAS
中国人は帰れよ
157: 2006/10/21(土)00:43 AAS
>>155
意味不明
158
(3): 2006/10/21(土)00:43 AAS
>>154
vectorが確保するメモリを要素数ぴったりに合わせるテクニックで
x.swap(std::vector<T>(x));
ってのがあったと思うけど、これもダメなの?
159
(1): 2006/10/21(土)00:46 AAS
一時オブジェクトをswapの引数にするのは何も問題ない(ちゃんとしたコンパイラなら)
160: 2006/10/21(土)00:50 AAS
constでない参照引数に一時オブジェクトはダメじゃなかったっけ?
161: 2006/10/21(土)01:01 AAS
>>158
VC++2003で警告レベルを最高にするとwarningになるな。
162
(1): 2006/10/21(土)01:27 AAS
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);は通った。
何じゃこりゃ。
163: 2006/10/21(土)02:05 AAS
>>158
swap技法はstd::vector<T>(x).swap(x);じゃない?
164: 2006/10/21(土)07:43 AAS
>>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なメンバ関数を呼べてしまう。
165: 2006/10/21(土)08:54 AAS
>>158
お前何にもわかってないのな

>>159
馬鹿確定
166: 2006/10/21(土)10:01 AAS
あ、一時オブジェクトに対して非constメンバを呼ぶのはいいのか。
167
(4): [haskell厨] 2006/10/21(土)21:13 AAS
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の)第二引数を渡し、最終結果を得たいという感じです。
168: 167 2006/10/21(土)21:20 AAS
fをgに変換する方法でも結構です。
よろしくおながいします
169
(1): 2006/10/21(土)21:44 AAS
>>167
どうしてもその変換をしないと駄目?
第一引数が既にあるならそれを部分適用することは簡単なんだが。
170
(1): 2006/10/21(土)22:05 AAS
思った程大変じゃなかった。

# 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';
}
171: 167 2006/10/21(土)22:05 AAS
>>169
第一引数の部分適用が簡単なのは承知しているのですが…変換希望です。
172: 167 2006/10/21(土)22:23 AAS
>170
ありがとうございます。やってみます。
173
(1): 2006/10/21(土)23:04 AAS
boost::bindでもいけるね
174: 2006/10/21(土)23:10 AAS
>>173
いってみてよ
175
(3): 2006/10/22(日)01:05 AAS
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です
176
(1): 2006/10/22(日)01:12 AAS
>>175
boost::bind(static_cast<int (*)(int, int)>(foo), _1, 100)
177
(5): 2006/10/22(日)12:38 AAS
>>175
class Void{}Void_v;
template<class T1, class T2, class T3=Void>struct select_f;
の特殊化を作ってfooの引数にVoid型があるなしで選択するとかは。
178: 2006/10/22(日)12:42 AAS
>>177
は?
179
(1): 2006/10/22(日)12:43 AAS
>>177
175は関数テンプレートな訳だが..
180: 177 2006/10/22(日)13:30 AAS
>>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);
こんな感じでキャストを使わない方法の案を提供したかったわけですよ。
181
(1): 2006/10/22(日)13:39 AAS
キャストを使わないでそれを使うことに何の意味があるの?

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

> あと、>177のように何の前置きにもなしに言って、理解してくれるエスパーだと思ったの?
タイピングの勢いだ。
183
(1): 2006/10/22(日)14:28 AAS
> キャストを使ったときに起きるテンプレート関数の特殊化に対しての曖昧性
具体例が欲しいな
1-
あと 818 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.026s