void func1(int){}
void func2(char){}
template <typename T> void (*p)(T); // error
p = func1;
p = func2;
p
のようなポインタを定義できないのはなぜですか?C++:テンプレートを使用した関数ポインタ
void func1(int){}
void func2(char){}
template <typename T> void (*p)(T); // error
p = func1;
p = func2;
p
のようなポインタを定義できないのはなぜですか?C++:テンプレートを使用した関数ポインタ
@ SergeyAと@Brianの助けを借りて、私はこの問題を解決しました。私はここで答えを編集します。
template<typename T> void (*p)(T)
:この場合、p
は可変テンプレート(C++ 14)です。だから我々はこのようp
を使用することができます。
p<int> = func1;
p<char> = func2;
template<class T> using p = void (*)(T)
:この場合には、p
は、タイプの種類(それだけtypedef
のようだが、我々は、エイリアステンプレートのtypedef
を使用するカント)です。私たちはこのようにそれを使用する必要があることを意味:
p<int> x1 = func1;
p<char> x2 = func2;
ところで、それらの両方がtemplate declaration
があるので、我々は、任意のブロックスコープでそれらを置くことはできません。
あなたはこのようにそれを行うことができます。
template<class T> using p = void (*)(T);
void f(int);
p<int> x = &f;
C++ 14実際に変数のテンプレートを可能にするので、テンプレートp
のあなたの定義が有効です。
ただし、p
は可変テンプレートであり、変数ではありません。実際の変数を取得するためには、あなたが特定の型とそれをインスタンス化する必要があり、そのように:あなたの例では
p<int> = func1;
p<char> = func2;
、変数p
はここに無関係な種類のオブジェクト(、互換性のない2つの機能を割り当てることができていますポインタ)。このような見かけの型の動的変化は、厳密に静的(コンパイル時)の構造であるテンプレートではサポートされていません。
このようなタイプシフトオブジェクトを実現するには、タイプの消去技術を適用する必要があります。その具体的なケースでは、std::function
はあなたの役に立つかもしれないように見えますが、固定機能の署名を決める必要があります。
Downvote?私の答えに何が問題なのかを教えてください。 – SergeyA
おそらく、彼はテンプレート引数なしで 'p = func1;'を書こうと思っていたのでOPです。 – kfsone
@kfsone、それはとにかくできません。 – SergeyA