テンプレート プログラミングに慣れていないので、構築しようとしている構造の中で迷子になっています。
class Base;
template <typename T>
class Foo : public Base {
protected:
T mValue;
std::vector<Base> mFooVector; // the idea is to have Foo<T> elements
// of several T types
public:
T value() {
return mValue;
}
void SetValueFromVector() {
mValue = Transform( mFooVector );
// to give you an idea of what awaits below
}
T Transform( std::vector<Base> ) {
// Question deals with what I want to do here
}
/*...*/
}
class Base{
// here, how to declare a virtual or template 'value()'
// that could be instantiated or specialized within Foo?
// Or should I declare a public 'mValue' of some type?
// (see below)
};
ではTransform
、さまざまな型の関連付けで配置できる「mFooVector」のすべての要素から value() を呼び出したいと思います。可能なすべての実際のケースを処理する、他の場所で定義された関数があります。しかし、 class のインスタンスとして宣言されたオブジェクトからどのように呼び出しvalue()
またはアクセスするかという問題が残っています。mValue
Base
昨日、質問をしましたが、それは私の研究の始まりにすぎません。ポリモーフィズムを使用したため、問題はコンテナーではなく、コンテナーに含まれるvalue()
インスタンスで関数を呼び出す必要があるという事実です。
編集:誰かに役立つ場合に備えて、最終的にクラスで定義した方法を次に示します。@PiotrNycz の回答を受け入れたのは、それが私の目標に本当に近づいたからですが、必要なものを正確に実装していませんでした。
class Base {
public:
virtual void setValue( &int ) =0;
virtual void setValue( &float ) =0;
virtual void setValue( &double ) =0;
}
template <typename T>
class Foo : public Base {
protected:
T mValue;
std::vector<Base*> mFooVector;
T Transform( std::vector<Base*> );
public:
// this is for use from outside the class
T value() {
return mValue;
}
void SetValueFromVector() {
mValue = Transform( mFooVector );
}
// the three below are only going to be used within 'Transform'
void setValue( int& i ) { i = mValue; }
void setValue( float& f ) { f = (float) mValue; }
void setValue( double& d ) { d = (double) mValue; }
}
// specialization of Transform
template<>
int Foo<int>::Transform( std::vector<Base*> v )
{
// here I only use setValue functions
// if for example I know that first v element is 'float'
float val;
v[0]->setValue( val );
return 3*int(val);
}
// and etc.