オペレータの引数に関数を取る

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kaiten

オペレータの引数に関数を取る

#1

投稿記事 by kaiten » 16年前

冬休みをいいことに入り浸っているkaitenです。
聞くばかりで申し訳ないのですがまた質問させていただきます。
環境はvista、VC++2008EEです。

今回はエラーなどではないのですが処理の方法が解らない(というか仕様上出来るのだろうか)ので。
というのも、オーバーロードしたオペレータの引数に関数を取りたいのです。
かつ、取る関数の引数は不明。といった条件としてこれは可能なのでしょうか?

別のアプローチも考えているのですが、今回の処理に関係なく気になる点なのでまずはお願いします。

Justy

Re:オペレータの引数に関数を取る

#2

投稿記事 by Justy » 16年前

 えーと、オペレータの引数に関数(へのポインタ?)を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]


 こんなかんじとか。

tk-xleader

Re:オペレータの引数に関数を取る

#3

投稿記事 by tk-xleader » 16年前

つまり、引数つきのマニピュレーターを作りたいということですか?
そうだとすると、普通の関数では難しいです。ひとつの解決方法としては…
#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

関数の数だけこれを繰り返せば、とりあえずやりたいことは実行できると思います。

kaiten

Re:オペレータの引数に関数を取る

#4

投稿記事 by kaiten » 16年前

お二方ありがとうございます。
携帯からだと厳しいものがありますね。帰宅してからじっくり見させていただきます。

やりたいことをもっと全体的に書いた方がいい気がしたので追記という形で。
現在switch構文もどきのような関数を作ろうとしているんです。(switch構文やif文素直に使えってツッコミはなしでお願いしますw)
case~:に当たる部分は恐らく作れたのですが肝心の処理を書く部分は流石にどうしようもなさそうなので関数をよぶことに限定しようと思ったのです。
引数なしの関数に限定すれば問題なさそうだったのですがあまりに寂しいのでこうして質問させていただきました。

YuO

Re:オペレータの引数に関数を取る

#5

投稿記事 by YuO » 16年前

それだったら,
struct Operation {
    virtual ~Operation (void) {}
    virtual void Execute (void);
};
というようなクラスを一個用意して,処理に当たる部分をExecute関数として実装した派生クラスを用意すればよいのではないでしょうか。
あとは,switch相当部分はOperationの派生クラスをnewするようにすればよいです。
# Strategyパターンになるはず……。

kaiten

Re:オペレータの引数に関数を取る

#6

投稿記事 by kaiten » 16年前

質問しっぱなしとかよくないよ俺…

教えていただいた方法で何とか実現できそうだったので解決押しときます。
疑似switch文とは別の物になりましたが……

閉鎖

“C言語何でも質問掲示板” へ戻る