可以为reinterpret_cast<<<< type-id>变量?

时间:2012-09-18 05:44:02

标签: c++ casting

目前我有这个用于排序功能:

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) );

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您始终可以在实施中使用template

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 );
  ....
}

答案 2 :(得分: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;