戻り型でC++の関数をテンプレート化すると、次のようになります。
template<class T> T foo(int x) { };
明示的なテンプレートの特殊化を使用して、double
インスタンスを作成できます。
template<> double foo<double>(int x) { };
前方宣言を使用して、未定義のインスタンスを作成しようとしましたstruct
:
struct bar;
template<> bar foo<bar>(int x) { }
これはで失敗しerror: return type ‘struct bar’ is incomplete
ます。前方宣言をいつ使用するかについての受け入れられた回答を読んだ後でも、これは許可されると思いました。なぜなら、のインスタンスを作成するまで、明示的なテンプレートコードは作成されないからです。明らかにそうではありません(なぜですか?)。foo<bar>
コンパイル時に型が存在しない可能性のある関数のコードを作成し、特定の明示的な特殊化がインスタンス化されている場合にのみコードをコンパイルすることは可能ですか?これの動機は、「オーバーロードされた」構造体リーダーであり、オーバーロード操作は、コンパイルの前に(スクリプトを介して)手続き的に生成されます。