如何使用指向通用模板类的指针来访问依赖于模板参数类型的成员函数

时间:2015-12-23 20:47:50

标签: c++ templates

有没有办法获得指向通用模板类的指针并调用其返回值取决于模板参数的函数?这就是我想要做的事情:

class Node{...}

template < typename Type > class NumberNode : public Node
{
    public:
        NumberNode( Type value ) : _value( value ) { }

        Type getValue() { return _value; }

    private:
        Type _value;
}

void foo( int x )    { /* do something */ }
void foo( float x )  { /* do something else */ }

void main(...)
{
    std::vector< Node* > nodes;

    nodes.push_back( new NumberNode< int >( 1 ) );
    nodes.push_back( new NumberNode< float >( 1.f ) );

    for( Node* ptr_node : nodes )
    {
        foo( static_cast< NumberNode* >( ptr_node )->getValue() );
    }
}

我不能这样做,因为static_cast( Derived* )应该知道完整的模板类型,这种类型会有所不同。我不能将Base作为模板类型,因为其他类也是从它派生的。有没有人知道一种解决方法?

1 个答案:

答案 0 :(得分:2)

这是正确的做法:

class Node 
{
 public:
  virtual void foo() = 0;
};

您的循环变为

for( Node* ptr_node : nodes )
{
    ptr_node->foo();
}

foo可以在NumberNode中实现,如下所示:

template <typename Type> 
void NumberNode::foo() 
{
  ::foo(_value);
}

此设计可能不再需要getValue(),您可以摆脱它。那是一件好事。吸气剂是弱设计的表现。对象应该的东西,而不是的东西。

如果由于某种原因你不希望在fooNode(也许你有太多函数,如foo并且不想污染界面),替代方法是为Node实施 VISITOR pattern 。然而,访客有其自身的缺点,所以我建议在这种情况下将其作为最后的手段。