1

ポイントの位置と基になる型がテンプレートである固定小数点演算クラスを作成しようとしています

template <int P, typename T>
class basic_fixedpoint{
    //stuff
};

また、さまざまな型に特化した単​​一のテンプレート化された暗黙のコンストラクターを公開したいと考えています

//inside basic_fixedpoint
    template <typename U>
    basic_fixedpoint(const U& arg);

他の場所では、int、float、double などの特殊化を実装します。ただし、P と T が異なる任意のタイプの basic_fixedpoint の一般的な特殊化も提供したいと考えています。これをテンプレート化されたテンプレートの特殊化としてどのように行うことができますか?

template <int P, typename T> //for the class whose constructor i specialize
template <int OP, typename OT> //for the parameters of the argument
basic_fixedpoint<P, T>::basic_fixedpoint<basic_fixedpoint<OP, OT> >(const basic_fixedpoint<OP, OT>& arg)
    : /*init things here*/ {} // this fails

コンストラクターのオーバーロードを避けて、ヘッダーに単一のインターフェイスを提示することを避けようとしています。ユーザーに「このクラスは、指定した型からきれいに構築されます。そうしないと、コンパイルに失敗して、理解できない長い段落が表示されます。エラーメッセージ"

サブ質問として: このクラスは、基本的な演算子 int()、演算子 float()、演算子 double() 変換も実装し、オーバーロードされた算術演算子と数学関数も提供されます。当然のことながら、このクラスで何かを呼び出そうとすると、あらゆる可能性が利用可能であるため、呼び出しがあいまいになります。

このクラスを完全に柔軟に保ちながら、適切に動作する明確でオーバーロードされた関数呼び出しを (常にクラスを double に変換して元に戻すのではなく) 許可するにはどうすればよいでしょうか?

4

1 に答える 1

2

自分が本当に求めているものは何なのか、もう一度考えてみてはいかがでしょうか。暗黙的な変換は常に良い考えではありません (多くの場合、悪い考えです)。また、同じ型との間で暗黙的に変換できるクラスは、常に悪い考えです (そのクラスを使用するたびにあいまいなエラーが発生し、両方向に進む可能性があるため、変換可能な to/from タイプを一緒にします。

設計ボードに戻って、何を暗黙にする必要があり、何を名前付きまたは明示的な変換にするかを決定する必要があります。

それに加えて、特定の質問に関しては、そのコンストラクターを特殊化することはできません。関数 (およびその中のコンストラクター) は完全に特殊化することしかできません。特に、クラス テンプレートを完全に特殊化せずに、テンプレート クラスのメンバーであるテンプレート関数を特殊化することはできません。つまり、次のように専門化できます。

basic_fixedpoint<5,int>::basic_fixed_point<int>(int)

しかし、あなたは専門化することはできません:

template <int N, typename T>
basic_fixed_point<N,T>::basic_fixed_point<int>(int)

NとはそのT専門分野に拘束されません。

于 2012-09-22T03:16:00.337 に答える