2017-10-28 11 views
9

を削除私は現在のテンプレートに苦しんでいます:私は今、私が使用できる基本的な数学を行い、テンプレートクラスAを、持っている(フロートのために、複雑な数字を倍)、このが冗長テンプレートタイプ

template <typename T> 
class A 
{ 
public: 
    void foo(std::vector<std::complex<T>>& result); 
}; 

のように見えますクラスA<double>, A<float>のように、私もA<std::complex<float>>A<std::complex<double>>のようにそれを使用したいと思います。後者を使用する場合、私はここで私ができる、fooの定義はstd::complex<T>例のための特定のテンプレートを作成する方法はあり

void foo(std::vector<std::complex<std::complex<float>>>& result); 

が好き

void foo(std::vector<std::complex<float>>& result); 

ないように見えるしたいと思います「内部」型にアクセスしますか?またはこれは可能ではありません/悪い練習ですか? この問題を解決する最も洗練された方法は何ですか?

答えて

5

(必要な場合、抽出物)別の方法は、検出するために型形質の作成を通過することができるフロートタイプ

template <typename T> 
struct getFloatType 
{ using type = T; }; 

template <typename T> 
struct getFloatType<std::complex<T>> 
{ using type = T; }; 

Aで使用(fT参照)

+0

これらの2つの方法は同じですか、またはこれを行うには好ましい方法の1つですか? – FlashTek

+0

@FlashTek - 彼らは本当に異なっています。このようにして、利点になる特殊化を作成することを避けることができます。他の理由で専門化が必要な場合もあります。このおもちゃの例では、私はそれが型特有の方法で好まれていると思います。あなたの本当の(私はより複雑な)必要性のために、専門化の方法が望ましいかもしれません。あなただけがあなたの質問に答えて答えることができます。 – max66

+0

@FlashTek 'foo'の署名だけを変更したいのであれば、これは簡単です。パーシャルスペシャライゼーションでは、より多くのものをカスタマイズできますが、依頼したとおり、複製されたコードをプライマリテンプレートと部分スペシャリゼーションの間で処理する必要があります。 – songyuanyao

2

あなたは、例えば、std::complexの任意のインスタンス化のためpartial specializationを作ることができます

template <typename T> 
class A<std::complex<T>> 
{ 
public: 
    void foo(std::vector<std::complex<T>>& result); 
}; 

そしてA<std::complex<double>>ため、fooの署名はvoid foo(std::vector<std::complex<double>>& result);あろう。

これらの重複したコードを処理するには、基本クラスを作成して共通メンバをその中に移動し、プライマリテンプレートと部分特殊化を両方から派生させることができます。例えば次いで

class Base { 
public: 
    void bar(...); 
}; 

template <typename T> 
class A : public Base { 
    ... 
}; 

template <typename T> 
class A<std::complex<T>> : public Base { 
    ... 
}; 
+0

'A'クラスの中に他の関数があると仮定して、これらの定義を部分仕様にも追加する必要がありますか? – FlashTek

+0

@FlashTekはい。基本クラスを作成して共通メンバをそのクラスに移動し、プライマリテンプレートと部分的な特殊化を両方ともそれから派生させることができます。私は、ヘッダー内の関数を宣言し、ボディ/ CPPでそれを定義すると – songyuanyao

+0

は、私は、コードを再利用することができ、または私は二回、CPP内の定義を追加する必要がありますか? – FlashTek