5

クラスに非型テンプレート引数を受け取りたいのですが、非型引数の型を指定したくありません。私はこれを書くことによってこれを行うことができます:

template<class Type, Type param>
class A
{};

その後、次のように使用できます。

A<int,3> a;

これは冗長です。なぜなら、それを知ったら、param = 3それを知っているからType = intです。次のすべての行が異なるタイプをコンパイルしてインスタンス化するようにこれを書く方法はありますか?

A<3> a;
A<3.0> b;
A<3.0f> c;
4

2 に答える 2

5

いいえ、それはできません。すべての非型テンプレート引数の型はパラメーターで定義する必要があり、使用から推測することはできません。つまり、コンパイラーが引数を分析するときに知るType必要があります。Type param

于 2013-02-05T15:22:34.187 に答える
1

が関数オブジェクトの場合A、関数テンプレートメンバーを通常のクラス内に配置することができます

class A  
{  
public: 
    template<class Type> 
    void operator()(Type param) { }  
};

または、クラステンプレートを関数テンプレート内にラップします

template<class Type> 
class A  
{  
public: 
    void operator()(Type param) { }  
};

template<class Type>
void fun(Type param) 
{ 
    A<Type>()(param); 
}

A()(3)そして、それを他の人と同じようfun(3)に呼んでいTypeますint。これは、関数テンプレートの引数が推定されているためですが、クラステンプレートの場合はそうではありません。したがってA、関数オブジェクト以外の目的でクラステンプレートを使用する場合は、その引数を指定する必要があります。

于 2013-02-05T15:38:17.183 に答える