2016-06-19 10 views
0

私は、さまざまなシグネチャの関数を引数としてとり、単純なシグネチャの関連関数を生成するテンプレートを持っています。細部は大変重要ではありません。それは何らかの代理人です。それはおおよそこのように見えます。関数パラメータDRYを使用し、マクロを使用しないでメタ関数を評価しますか?

struct foo; 

using desired_signature_t = int(*)(foo*); 

template <typename F, F f> 
struct make_delegate; 

template <typename... Args, int(*target_func)(foo*, Args...)> 
struct make_delegate<int(*)(foo*, Args...), target_func> { 
    static int delegate(foo *) { ... } 
}; 

がそれを使用するには、私が現在やっていることは次のとおりです。

#define MAKE_DELEGATE(f) &make_delegate<decltype(f), (f)>::delegate 

int bar(foo *, int, float, double); 

desired_signature_t delegated_bar = MAKE_DELEGATE(&bar); 

は、私が実際に一度、私は、引数を入力する必要が好きではない、ので、decltypeのために1回、2回マクロを使用し、関数ポインタ。

マクロを使用せずに2回入力することなくこれを行う方法はありますか?問題は、型のないテンプレートパラメータの型を推論することができないため、以前のテンプレートでこれらの型を最初に推論する方法を見つけることができなかったことです。私は、ヘルパーとしてテンプレートコンストラクタを使ってリテラルオブジェクトを構築しようと考えましたが、それが有用かどうかはわかりません - 私はまだctorのパラメータをctorのテンプレートパラメータとして使用できず、私は関数型をもう知りません。

+0

Colud [本](http://stackoverflow.com/questions/37541787/create-a-stdfunction-type-with-limited-arguments)は関心のありますか? – skypjack

+2

'delegate'の定義で' target_func'をどのように使うつもりかについていくつかの詳細を述べることができますか?また、ソリューションが全く異なる可能性があるため、目標が何であるかを知ることは常に面白いです。 –

+0

@ JohanBoule:基本的な考え方は、 'foo *'は、関数が期待している残りのパラメータにアクセスできるということです。可能であれば、デリゲートはそれらを抽出し、 'target_func'を呼び出します。それらを抽出できない場合は、エラーを通知します。 –

答えて

関連する問題