以前、次の 2 つの質問をしました。
私の質問は、私のクラスである最初の質問で提供されたクラスに関するものですSignal
。
クラス内で伝えようとしている考えは、このクラスをテンプレートにしたくないということです。ただし、「時間」関連の変数を保存する必要がありますが、これを保存するには2つの方法があります。整数型: "Discrete" または浮動小数点型: "Continuous" として。
テンプレートのエイリアシングを使用してコードを簡素化することを考えていました。コードからわかるように:
template<typename T>
using TimeSignal = T;
using DiscreteTime = TimeSignal<std::uint64_t>;
using ContinousTime = TimeSignal<double>;
テンプレートエイリアスの使用について私が考えていた方法です。
次に、非テンプレート クラス自体内。
class Signal {
private:
template<typename T>
static TimeSignal<T> time_;
// ...
};
テンプレート変数を Signal のメンバーとして持っています。テンプレート変数を持つためには、静的でなければなりません。クラスをテストする目的で、現在、そのコンストラクターを使用して何かをインスタンス化し、この変数に格納しています。
class Signal {
public:
template<typename T>
explicit Signal( TimeSignal<T> time ) {
time_<T> = time;
}
};
この変数へのアクセスに関しては、2 つの選択肢があります。スコープ解決演算子を使用して静的関数を介してアクセスするか、オブジェクトの非静的メンバー関数を介してアクセスできます。
class Signal {
public:
template<typename T>
auto atTime() { return time_<T>; }
// or
template<typename T>
static auto atTime() { return time_<T>; }
};
クラスが正しくコンパイルおよびビルドされるようにするには、このコード行を、それを使用している他の CPP ファイルのクラス外で定義する必要があります。
template<typename T>
TimeSignal<T> Signal::time_;
変数は静的メンバーであるため、これは理解できます。
これにより、私のクラスの現在の構造の背景がわかります。さらに追加を続ける前に、このコード設計について知っておきたいことがいくつかあります。
最初の簡単な質問は次のとおりです。私のコードをそのままにしておくかどうか。これは、変数を取得するための推奨される方法です。
DiscreteTime t1{ 5 }; // 10 seconds
ContinousTime t2{ 7.9 }; // 7.9 seconds
Signal s1( t1 ); // Signal S1 using Discrete Time intervals
Signal s2( t2 ); // Signal S2 using Continuous Time
// Accessing the member variable: which is preferred:
// via static method and scope resolution?
auto time1 = Signal::atTime<Discreate>();
auto time2 = Signal::atTime<Continuous>();
// or through non static object member?
auto time1 = s1.atTime<Discrete>();
auto time2 = s2.atTime<Continous>();
次の質問は、設計上の決定全体に影響するため、前の質問よりも少し重要です...
この種の状況でのテンプレートのエイリアシングに関する私の推論は正しいですか、私の当初の考えや意図は次のとおりです。
クラス内の変数テンプレートを astd::uint64_t
または aにしたいのですdouble
が、上記の名前を使用して、基になる型を typedef であるかのように表現したいDiscreteTime
と考えています。ContinousTime
そうでない場合は、他の可能な実装を見たいと思います。