2016-05-17 10 views

答えて

0

@ 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があるので、我々は、任意のブロックスコープでそれらを置くことはできません。

4

あなたはこのようにそれを行うことができます。

template<class T> using p = void (*)(T); 

void f(int); 
p<int> x = &f; 
+0

Downvote?私の答えに何が問題なのかを教えてください。 – SergeyA

+0

おそらく、彼はテンプレート引数なしで 'p = func1;'を書こうと思っていたのでOPです。 – kfsone

+0

@kfsone、それはとにかくできません。 – SergeyA

3

C++ 14実際に変数のテンプレートを可能にするので、テンプレートpのあなたの定義が有効です。

ただし、pは可変テンプレートであり、変数ではありません。実際の変数を取得するためには、あなたが特定の型とそれをインスタンス化する必要があり、そのように:あなたの例では

p<int> = func1; 
p<char> = func2; 
+1

OPの例では、 'p'は変数ではなく型です。 – SergeyA

+1

@SergeyA私は違うと思う。 C++ 14でコンパイルした場合、 'p'は可変のテンプレートです。 – Brian

+0

@SergeyA OPは、 'void(*)(int)'か 'void(*)(void)'のいずれかへのポインタを受け入れる変数を作ろうとしているようです。 – kfsone

0

、変数pはここに無関係な種類のオブジェクト(、互換性のない2つの機能を割り当てることができていますポインタ)。このような見かけの型の動的変化は、厳密に静的(コンパイル時)の構造であるテンプレートではサポートされていません。

このようなタイプシフトオブジェクトを実現するには、タイプの消去技術を適用する必要があります。その具体的なケースでは、std::functionはあなたの役に立つかもしれないように見えますが、固定機能の署名を決める必要があります。

関連する問題