1

現在、私はソート機能のためにこれを持っています:

bool operator()( CVParent* lhs, CVParent* rhs ) 
{
  double dFirstValue  = reinterpret_cast< CVChild * >( lhs )->GetValue( m_lFeature );
  double dSecondValue = reinterpret_cast< CVChild * >( rhs )->GetValue( m_lFeature );
  ....
}

現在、type-idはCVChild *としてハードコーディングされていますが、パラメーターにすることはできますか?CVParentの派生クラスごとに関数を記述したくありません。

編集:私はロストの推奨に基づいて変更を加えました:

class Compare_Functor
{
public:

    Compare_Functor( const long& lFeature, const bool& bIsAscending )
    {
        m_lFeature = lFeature;
        m_bIsAscending = bIsAscending;
    }

    template <class T> 
    bool operator()( CVParent* lhs, CVParent* rhs ) 
    {
      double dFirstValue  = reinterpret_cast< T * >( lhs )->GetValue( m_lFeature );
      double dSecondValue = reinterpret_cast< T * >( rhs )->GetValue( m_lFeature );
      ....
    }

private: 

    long m_lFeature;
    bool m_bIsAscending;
}

現在の使用法(stl sort関数呼び出しを修正する方法は?):std :: sort(m_pList、m_pList + GetCOunt()、Compare_Functor(lFeature、TRUE));

コードを修正しました。みんなの助けてくれてありがとう!

template <class T>
class Compare_Functor
{
public:

    Compare_Functor( const long& lFeature, const bool& bIsAscending )
    {
        m_lFeature = lFeature;
        m_bIsAscending = bIsAscending;
    }

    bool operator()( CVParent* lhs, CVParent* rhs ) 
    {
      double dFirstValue  = reinterpret_cast< T * >( lhs )->GetValue( m_lFeature );
      double dSecondValue = reinterpret_cast< T * >( rhs )->GetValue( m_lFeature );
      ....
    }

private: 

    long m_lFeature;
    bool m_bIsAscending;
}


//Usage
std::sort( m_pList, m_pList+GetCOunt(), Compare_Functor<CChild>(lFeature, TRUE) );
4

3 に答える 3

2

動的な (実行時にのみ知られている) 型を に渡すことはできませんreinterpret_cast。静的でなければなりません (コンパイル時に認識されます)。

他の回答で述べたようにテンプレートを使用できますが、コンパイラは呼び出し式からそれを推測できないため、関数呼び出しごとにキャストする型を明示的に設定する必要があります。

template <class T> struct Functor
{
   bool operator()(CVParent* lhs, CVParent* rhs) { ... }
};

CVParent p1, p2;
...

// Usage
Functor<CVChild1>().operator()(&p1, &p2);
Functor<CVChild2>().operator()(&p1, &p2);
Functor<CVChild3>().operator()(&p1, &p2);
于 2012-09-18T06:02:49.730 に答える
1

テンプレートを使用することをお勧めしますが、関数テンプレートではなくクラステンプレートを使用することをお勧めします。これにより、標準ライブラリアルゴリズムとコンテナでの使用がより自然になります。

template <typename T>
struct CVFuntor 
{
  bool operator()( CVParent* lhs, CVParent* rhs ) const
  {
    double dFirstValue  = reinterpret_cast<T*>( lhs )->GetValue( m_lFeature );
    double dSecondValue = reinterpret_cast<T*>( rhs )->GetValue( m_lFeature );
    ....
  }
};

それで

typedef CVFunctor<CVChild> ParentToChild;
typedef CVFunctor<CVOtherChild> ParentToOtherChild;

....

ParentToChile p2ch;
bool b = p2ch(SomeParentPtr1, SomeParentPtr2);

の使用を再検討する必要がありreinterpret_castます。ここでは、へのチェックコールのdynamic_cast方が適しているようです。

T* t = dynamic_cast<T*>( lhs);
if (!t) return false;
于 2012-09-18T06:16:50.323 に答える
1

実装ではいつでもテンプレートを使用できます。

template <class Type>
bool operator()( CVParent* lhs, CVParent* rhs ) 
{
  double dFirstValue  = reinterpret_cast< Type * >( lhs )->GetValue( m_lFeature );
  double dSecondValue = reinterpret_cast< Type * >( rhs )->GetValue( m_lFeature );
  ....
}
于 2012-09-18T05:51:34.123 に答える