作成されたオブジェクトが特定のタイプである場合にのみ、メンバ関数定義でクラステンプレートを作成できますか?オブジェクトがX型である場合、クラステンプレート、メンバ関数定義?
私はint型またはdouble型を格納するために使用するテンプレートクラスを作成しましたが、倍精度用にも精度を設定できます(myclassで作成されたオブジェクト< double>にはこの機能が必要ですが、myclass < int>それが全く存在する必要はありません)。
私は基本クラステンプレートを使用し、それを使用して新しいクラス "myInt"、 "myDouble"を作成し、myDoubleクラスでのみ機能を実装することができますが、機能を定義するためには、関数とメンバ変数)がクラステンプレートの倍精度化のために使用できますか?
のは、私が何をしたいのかを示すために例を追加してみましょう:
#include <iostream>
#include <iomanip>
class commonBase{
public:
void setState(int state);
virtual void print() = 0;
private:
int _my_state;
};
template <typename T>
class generalObject : public commonBase {
public:
void value(T value);
void print(){ std::cout << "My value: " << _my_value << std::endl; }
private:
T _my_value;
};
template <typename T>
void generalObject<T>::value(T value){
_my_value = value;
}
// Is there any way do specialize only only whats different from the generalObject template?
// Here I thought I could specialize the case where a generalObject is created of <double>, but
// when I do, nothing is derived from generalObject (or at least not visible as far as I can tell)
template<>
class generalObject<double>{
public:
void setPrecision(int precision){ _my_precision = precision; }
// here I would like a special implementation of print(), which overrides the print() in generalObject
// and instead also prints according to the precision set when the object is of <double> type.
// Row below an example which doesn't work (compiler error, _my_value undefined)
void print(){ std::cout << "My value: " << std::setprecision(_my_precision) << _my_value << std::endl; }
private:
int _my_precision;
};
int main(int argc, char* argv[]){
generalObject<int> o1;
o1.value(1);
o1.print();
o1.setState(1); //inherited from the commonBase
generalObject<double> o2;
o2.setPrecision(2);
o2.value(2); //here value isn't available (compile error)
o2.print();
o2.setState(123); //also isn't available (compile error)
}
おそらくテンプレートの特殊化が必要です –
関数の部分は簡単で、クラステンプレートの特殊化は必要ありません。問題は、データメンバーの存在/非存在を望み、それが何らかの専門化に効果的につながることです。 – lapk