ショートバージョンタイプを推測したいと思います:入力する必要が常に私はメンバ関数へのポインタから、C++テンプレートで
の代わりに:
auto function_pointer = &decorator<int, Foo, void &Foo::bar(int)>
を私ができるようにしたいと思いますただint
とFoo
が自動的にから抽出され
auto function_pointer = &decorator<void &Foo::bar(int)>
を書き込みます>。
私は手始めに:
map<string, Object*> all_object_instances;
class Object {
public:
Object(const string &name) { all_object_instances[name]=this; }
virtual ~Object() { all_object_instances.erase(name); }
};
class Foo : public Object {
public:
Foo(const string &name) : Object(name) {}
void bar(int);
};
私はいくつかの装飾ではFoo ::バー(INT)を呼び出す機能を、必要とするので、私は書く:
template <class Arg, class C, void C::*T(Arg)>
void decorator(const string &name, const string &s_arg)
{
Arg a = my_convert(s_arg);
C* c = dynamic_cast<C*>(all_object_instances[name]);
(c->*T)(a);
}
私のメインコードはこのようにしなければなりません:
new Foo("MyFoo");
....
auto saved_f = &decorator<int, Foo, void &Foo::bar(int)>;
....
saved_f("MyFoo", "123");
....
delete all_object_instances("MyFoo") // for symmetry
私はちょうど1つのテンプレート引数持つことができればそれは、多くの方のようになります。
saved_f = &decorator<void &Foo::bar(int)>;
そして両方'foo' で、および"int型引数からの導出:
template <TEMPLATE MAGIC>
void decorator(const string &name, const string &s_arg)
{
typedef ARG_MAGIC ARG;
typedef CLASS_MAGIC C;
Arg a = my_convert(s_arg);
C* c = dynamic_cast<C*>(all_object_instances[name]);
(c->*T)(a);
}
を
このようなことはありますか?
私が編集した質問:
それで最後に:次に
あなたは、のような何かをするクラスを取得し、型を返すためにいくつかの機能の特徴を必要としますよりシンプルで明確ですか?私の「ショートバージョン」は正しいですか?もしそうなら、質問の残りの部分はほとんど無関係であるので、大幅に簡素化(または削除すること)を考慮する必要があります。 –
はい、それは素晴らしい改訂です。私は長いバージョンを残しておきたいと思います。なぜなら、時々問題の私の刺しは間違っていたからです:) ありがとうtho – dandax
メンバ関数のポインタ型を指定するだけで2つのテンプレートパラメータに絞り込むことができますが、私が言うことができるように、[関数ポインタのテンプレート引数の型を推論する方法はありません](http://stackoverflow.com/questions/17736337/is-there-a-way-to-deduce-the-value-of -a-function-pointer-template-parameter)を使用します。しかし、その答えに応じて、あなたは*(*私は知っている/)マクロを作ることができます。それ以降は、戻り値、クラス、および引数の型を見つけることの唯一の問題です。(http://coliru.stacked-crooked.com/a/a577f71af2697f16) – jaggedSpire