6

は、私は長いテンプレート関数の宣言を持っています。私はそれを明示的にインスタンス化したいと思います。 明示的なテンプレートのインスタンス化でコードの重複を避けるためにdecltype()を使用できますか?無過負荷と</p> <pre><code>template <typename T> void foo(lots ofargs, goin here, andeven more, ofthese arguments, they just, dont stop); </code></pre> <p>:

template void foo<int>(lots ofargs, goin here, andeven more, ofthese arguments, they just, dont stop); 

しかし、私は本当に長い宣言することをコピーしたくない:私は(= int Tのために言う)を書くことができます。

template <typename T> using bar = decltype(foo<T>); 

、その後:私はのようなものを言うことができるようにを好きだろう

template bar<int>; 

は今、最初の行は(GCC 4.9.3)コンパイルしますが、2行目は、」doesnのt。どういうわけか、それを働かせることはできますか?または、decltype()を使用して、インスタンス化の宣言をコピーしないようにすることはできますか?

注:私はこのケースをサポートする解決策が必要なので、引数だけから型を推論することはできません。

答えて

3

[temp.explicit]から:

明示的なインスタンス化のための構文は次のとおりです。
        明示的インスタンス化
               にextern オプトtemplate宣言

[...]明示的なインスタンスは、関数またはメンバ関数のためのものである場合、宣言で修飾されていない-IDは すべてのテンプレート引数を推定することができるテンプレートID又は、いずれかでなければなりませんテンプレート名またはoperator-function-id[注:宣言は修飾-IDを宣言することができ、その場合、修飾-ID非修飾-IDテンプレートIDでなければなりません。 -end note]

宣言が必要です。のは、我々が開始しているふりをしてみましょう:

template <class T> void foo(T) { } 

我々が明示的にちょうど経由特化することができます

template void foo<char>(char); // template-id 
template void foo(int);   // or just template-name, if the types can be deduced 

これが書かれたものと同じです。

持つと同じである
using Fc = void(char); 
using Fi = void(int); 

template Fc foo<char>; 
template Fi foo; 

書面:

template <class T> using F = decltype(foo<T>); 

template F<char> foo<char>; 
template F<int> foo; 

基本的に、template bar<int>が機能しない理由は、宣言ではないということです。あなたはあまりにも名前が必要です。

+0

私は実際に興味があった関数引数のテンプレート引数を推論できないように質問を編集しています。私はちょうど良い尺度のためにT tを振っただけで、あなたがそれを使うために...あなたの答えがまだ関連しているなら、素晴らしい。 – einpoklum

+0

@einpoklum質問から遠く離れているわけではありません。なぜ私の答えは関係ないと思いますか? – Barry

+0

私はそれが無関係ではないと言っていませんでした。私はちょうどあなたが実際よりも多くのことに頼っている可能性がある(最後の編集の前に)感覚を持っていました。 – einpoklum

関連する問題

 関連する問題