1

テンプレート プログラミングに慣れていないので、構築しようとしている構造の中で迷子になっています。

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()またはアクセスするかという問題が残っています。mValueBase

昨日、質問をしましたが、それは私の研究の始まりにすぎません。ポリモーフィズムを使用したため、問題はコンテナーではなく、コンテナーに含まれる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.
4

1 に答える 1

0

考えられるすべての値の型を知っていると仮定します。それらがint/float/...であるとします。次に、値の型のいずれかに追加するために、基本クラスを (純粋仮想メソッドによって) 準備する必要があります。

class Base {
public:
  virtual ~Base() {}
  virtual void addTo(int& value) = 0;
  virtual void addTo(long& value) = 0;
  virtual void addTo(float& value) = 0;
  virtual void addTo(double& value) = 0;
  // add as many functions as you need and of types you need in your design
  // these types not necessarily must be simple basic types
};

template <class Type> 
class Foo : public Base {
public:
    T Transform( std::vector<Base> ) {
        T retVal = T();
        // Question deals with what I want to do here
        for (auto it = mFooVector.begin(); it != mFooVector.end(); ++i)
          it->addTo(retVal);
        return retVal;
    }
  // and the base interface implementation 
  // (for other types implementation does not need to be some simple)
  virtual void addTo(int& value) { value += mValue; }
  virtual void addTo(long& value) { value += mValue; }
  virtual void addTo(float& value) { value += mValue; }
  virtual void addTo(double& value) { value += mValue; }

private:
  std::vector<std::shared_ptr<Base>> mFooVector;
  // you can here ^^^^^^^^^^^^^^^^^ use simple Base* pointer but must 
  // then define d-tor, copy c-tor and assignment operator
  T mValue;  
};
于 2012-10-20T10:50:47.023 に答える