2012-02-24 16 views
10

レッツ・asssume、:関数のテンプレートをテンプレート引数として渡すことはできますか?私たちは、テンプレートfuncionを持っていることを

template<typename T1, typename T2, typename T3> 
T3 such_fun(T1 a, T2 b) { 
    // do something... 
} 

、今私たちは、例えば、別のテンプレートでは、引数としてそれを使用したいですそのように

template<typename T1, template<typename, typename, typename> some_function> 
void big_fun(T1 a) { 
    // some code... 
    a = some_function<T1, T1, T1>(a, a); 
    // some code... 
} 

可能でしょうか?

私はdefined()演算子で構造体を使用できることを知っています。私は機能について興味があります。

EDIT:

私はその質問に私の友人を書いていたものの部分的な解決策が見つかりました:

template<typename T1, T1 (*some_function)(T1, T1)> 
void big_fun(T1 a) { 
    // some code... 
    a = some_function(a, a); 
    // some code... 
} 

しかし、まだを - それは前に関数型のマテリアなく可能だ場合、私は好奇心が強いですコール。たとえば、渡されたテンプレートをさまざまな種類の組み合わせで呼び出すことができます。

template<typename T1, typename T2, template<typename, typename, typename> some_function> 
void big_fun(T1 a, T2 b) { 
    // some code... 
    a = some_function<T1, T1, T1>(a, a); 
    a = some_function<T1, T2, T1>(a, b); 
    b = some_function<T2, T2, T2>(b, b); 
    b = some_function<T2, T1, T2>(b, a); 
    // some code... 
} 

答えて

8

いいえ、これはできません。 N3337で14.3.3から:

テンプレートテンプレートパラメータのテンプレート引数はクラステンプレートまたはエイリアステンプレートの 名前でなければならない、 ID式のように表します。 template-argumentがクラステンプレートの名前を指定するとき、 プライマリクラステンプレートのみが考慮されます。 テンプレート引数と対応するパラメータが一致します。部分テンプレート の特殊化は、パラメータリストがテンプレートテンプレートパラメータのパラメータリスト と一致しても考慮されません。

最初の段落では、明示的にクラステンプレートのみが記述されています。私もそれはあなたがすでに関数で非常によく似た何かを行うことができるか、または引数としてstd::functionを行うことができれば、本当に問題にならないと思います。

+1

あなたが言っていることのことを私は理解していません。-1、スタンドアレーに慣れていない私たちのためにilustrationを提供できますか? – lurscher

+0

@lurscher _you_は、それがdownvoteの恐ろしい理由であることを理解していないためです。私はそれを理解していないので、彼らが量子物理学について話すとき、量子物理学者にはあきらめない。 –

+0

@SethCarnegie、私は同意しません。私は、それだけで、非常に良い理由だと思う。それに、答えは間違っている。 C++ 03であっても、質問がしたいことは完全に可能です。私は、SOが尋ねるものと、pmrが答えるものとの間には断絶があると思います。もし彼が彼の答えを改善すれば、私はそれを撤回すること以上に喜んでくれるでしょう – lurscher

1

C++のテンプレートは、コンパイル時にコンクリート型を使用してコンパイルされます。彼らを知る必要があります。

これは、引数を導き出すことができる関数テンプレートを渡すことで、部分的な解決策をさらに進めることができると述べています。これは、lessをタイプするだけの具体的な型の関数を明示的に渡すことと違いはないことに注意してください。

限り template< typename T1, typename T2, typename T3> someTemplateが希望どおりに実行し、他のテンプレート内で、できるだけ多くの組み合わせで使用することができ、エラーなしでいくつかの実際のクラスと評価されたよう
template<typename T> 
T square(T a, T b) 
{ 
    return a * b; 
} 

template<typename T, T (*some_function)(T, T)> 
T test(T a) 
{ 
    return square (a, a); 
} 

void main() 
{ 
    int a = test<int, square>(2); 
    float b = test<float, square>(2.2f); 
} 
+0

私は実際にそのコードと "部分的解決"コードの違いは見ません。このアプローチでは、新しいテンプレート引数を明示的に追加することなく、さまざまな型の 'some_function'を使用することは不可能です。より柔軟な(ただし、まだクラスの使用がない)方法があれば、私は興味があります。 –

0

コンパイルしようとしましたか?

+0

私はクラスを使用できることを知っています。私は私のポストでそれを書いた。問題は共通の機能についてです。しかし、@ pmrが書いたところによると、構文的に不可能に思えます。 –

+1

OP(およびあなたの拡張機能)が使用する構文は無効です。正しいものは 'template class someTemplate'です。ここでは '評価'については何もありません。テンプレートテンプレートの引数は、同じテンプレートパラメータリストを持つクラステンプレートの名前とのみ一致させることができます(非テンプレートのテンプレート引数にとっては重要です)。このテンプレート名は、他のテンプレートに注入され、そこでインスタンス化されます。問題は 'class template'です。私はこの制限の具体的な理由は見当たりませんが、私は委員会にいるのではなく、弁護士もいません。 – pmr

+0

@ pmr Uhm。まあ。私が例で使用した構文は部分的に擬似コードだった。すなわち、私は 'class'キーワードを使うことができないと知っていたので、私は何も使っていなかった。それはアイディアに関するものでした。 –

関連する問題