冬休みをいいことに入り浸っているkaitenです。
聞くばかりで申し訳ないのですがまた質問させていただきます。
環境はvista、VC++2008EEです。
今回はエラーなどではないのですが処理の方法が解らない(というか仕様上出来るのだろうか)ので。
というのも、オーバーロードしたオペレータの引数に関数を取りたいのです。
かつ、取る関数の引数は不明。といった条件としてこれは可能なのでしょうか?
別のアプローチも考えているのですが、今回の処理に関係なく気になる点なのでまずはお願いします。
オペレータの引数に関数を取る
Re:オペレータの引数に関数を取る
えーと、オペレータの引数に関数(へのポインタ?)を1つとるけど、
その関数の引数の型、数は不明、ということでいいでしょうか?
そういうことであれば、その関数の引数丸ごと関数オブジェクトに
くるんでしまえば出来なくもないです。
例えば
[color=#d0d0ff" face="monospace]
#include <iostream>
#include <boost/bind.hpp>
struct Hoge {};
template <typename Func>
const Hoge& operator <<(const Hoge& hoge, Func f)
{
f();
return hoge;
}
// 引数と型が異なる関数
enum E { e_0, e_1, e_2 };
void test_a(E e, int i) { std::cout << "a" << i << std::endl; }
void test_b(int i1, E e, int i2) { std::cout << "b" << i1 * i2 << std::endl; }
void test_c(int i1, int i2, E e, int i3) { std::cout << "c" << i1 * i2 * i3 << std::endl; }
int main(void)
{
Hoge hoge;
hoge << boost::bind(&test_a, e_0, 3)
<< boost::bind(&test_b, 3, e_1, 5)
<< boost::bind(&test_c, 3, 5, e_2, 7);
return 0;
}
[/color]
こんなかんじとか。
その関数の引数の型、数は不明、ということでいいでしょうか?
そういうことであれば、その関数の引数丸ごと関数オブジェクトに
くるんでしまえば出来なくもないです。
例えば
[color=#d0d0ff" face="monospace]
#include <iostream>
#include <boost/bind.hpp>
struct Hoge {};
template <typename Func>
const Hoge& operator <<(const Hoge& hoge, Func f)
{
f();
return hoge;
}
// 引数と型が異なる関数
enum E { e_0, e_1, e_2 };
void test_a(E e, int i) { std::cout << "a" << i << std::endl; }
void test_b(int i1, E e, int i2) { std::cout << "b" << i1 * i2 << std::endl; }
void test_c(int i1, int i2, E e, int i3) { std::cout << "c" << i1 * i2 * i3 << std::endl; }
int main(void)
{
Hoge hoge;
hoge << boost::bind(&test_a, e_0, 3)
<< boost::bind(&test_b, 3, e_1, 5)
<< boost::bind(&test_c, 3, 5, e_2, 7);
return 0;
}
[/color]
こんなかんじとか。
Re:オペレータの引数に関数を取る
つまり、引数つきのマニピュレーターを作りたいということですか?
そうだとすると、普通の関数では難しいです。ひとつの解決方法としては…
https://www.webfile.jp/dl.php?i=455717& ... 5e81afef35
関数の数だけこれを繰り返せば、とりあえずやりたいことは実行できると思います。
そうだとすると、普通の関数では難しいです。ひとつの解決方法としては…
#include<iostream> struct MyManipObject{ int a; void operator()(std::ostream& o)const{/*ここにやりたいことを書く*/ o<<"マニピュレータの引数は:"<<a; } private: MyManipObject(int in):a(in){} friend MyManipObject mymanip(int); }; std::ostream &operator<<(std::ostream& o,const MyManipObject& obj) { obj(o); return o; } MyManipObject mymanip(int in) { return MyManipObject(in); } int main() { std::cout<<mymanip(7)<<std::endl; }これをMinGWでコンパイルしたバイナリを添付しておきます。(できないようなのでアップローダーにアップしておきます。)
https://www.webfile.jp/dl.php?i=455717& ... 5e81afef35
関数の数だけこれを繰り返せば、とりあえずやりたいことは実行できると思います。
Re:オペレータの引数に関数を取る
お二方ありがとうございます。
携帯からだと厳しいものがありますね。帰宅してからじっくり見させていただきます。
やりたいことをもっと全体的に書いた方がいい気がしたので追記という形で。
現在switch構文もどきのような関数を作ろうとしているんです。(switch構文やif文素直に使えってツッコミはなしでお願いしますw)
case~:に当たる部分は恐らく作れたのですが肝心の処理を書く部分は流石にどうしようもなさそうなので関数をよぶことに限定しようと思ったのです。
引数なしの関数に限定すれば問題なさそうだったのですがあまりに寂しいのでこうして質問させていただきました。
携帯からだと厳しいものがありますね。帰宅してからじっくり見させていただきます。
やりたいことをもっと全体的に書いた方がいい気がしたので追記という形で。
現在switch構文もどきのような関数を作ろうとしているんです。(switch構文やif文素直に使えってツッコミはなしでお願いしますw)
case~:に当たる部分は恐らく作れたのですが肝心の処理を書く部分は流石にどうしようもなさそうなので関数をよぶことに限定しようと思ったのです。
引数なしの関数に限定すれば問題なさそうだったのですがあまりに寂しいのでこうして質問させていただきました。
Re:オペレータの引数に関数を取る
それだったら,
あとは,switch相当部分はOperationの派生クラスをnewするようにすればよいです。
# Strategyパターンになるはず……。
struct Operation { virtual ~Operation (void) {} virtual void Execute (void); };というようなクラスを一個用意して,処理に当たる部分をExecute関数として実装した派生クラスを用意すればよいのではないでしょうか。
あとは,switch相当部分はOperationの派生クラスをnewするようにすればよいです。
# Strategyパターンになるはず……。
Re:オペレータの引数に関数を取る
質問しっぱなしとかよくないよ俺…
教えていただいた方法で何とか実現できそうだったので解決押しときます。
疑似switch文とは別の物になりましたが……
教えていただいた方法で何とか実現できそうだったので解決押しときます。
疑似switch文とは別の物になりましたが……