【问题标题】:C++ template methodC++模板方法
【发布时间】:2013-12-03 15:41:30
【问题描述】:

我写了一个简化版的 STL basic_string 类:

template<typename chrT>
class strT
{
protected:

    chrT * m_pcBuf;

    size_t m_nLen;

public:

    strT( void );

    strT( const chrT * pcStr );

    strT( const strT<chrT> & rsStr );

    virtual ~strT( void );

    virtual inline size_t len( void ) const;

    virtual int cmp( const strT<chrT> & rsStr ) const;

    virtual inline const chrT & operator [] ( size_t nPos ) const;

    virtual inline chrT & operator [] ( size_t nPos );

    virtual bool & operator == ( const strT<chrT> & rsStr ) const;

    virtual bool & operator != ( const strT<chrT> & rsStr ) const;

    virtual bool & operator < ( const strT<chrT> & rsStr ) const;

    virtual bool & operator > ( const strT<chrT> & rsStr ) const;

    virtual bool & operator <= ( const strT<chrT> & rsStr ) const;

    virtual bool & operator >= ( const strT<chrT> & rsStr ) const;

    virtual inline strT<chrT> & operator = ( const strT<chrT> & rsStr );

    virtual inline operator chrT * ( void );

protected:

    void _alloc( size_t nLen );

    void _realloc( size_t nLen );

public:

    static const size_t none;
};

template<typename inchr, typename outchr>
strT<outchr> convert( const strT<inchr> & rsIn );

typedef strT<char> str;
typedef strT<wchar_t> wstr;

目前,如果我想在 char 和 wchar_t 之间进行转换,我可以这样做:

int main( void )
{
    str as = "foo";
    wstr ws = convert<char, wchar_t>( as );
}

但我希望有一个允许进行此类转换的模板方法,而不是这种功能方法。这很可能是错误的,但这是我想做的:

template<typename chrT>
class strT
{
    // ...

public:

    template<typename outchr>
    virtual strT<outchr> convert( void ) const;

    // ...
}

template<typename chrT, typename outchr>
strT<outchr> strT<chrT>::convert<outchr>( void ) const
{
    // ...
}

然后:

int main( void )
{
    str as = "foo";
    wstr ws = as.convert<wchar_t>();
}

请问可以吗?

感谢您的帮助!

PS : 忘了说我不想使用 C++11 的特性。

【问题讨论】:

    标签: c++ string templates methods


    【解决方案1】:

    为什么不添加一个模板化的构造函数?

    template<typename chrT>
    class strT
    {
    public:
        template<typename otherT>
        strT(otherT* o) { ... }
    }
    

    要实现转换,您可以针对chrTotherT 的不同可能性专门构造构造函数

    【讨论】:

    • 谢谢,但这将确定对象构造时的转换输出类型,并且每个实例只允许一个目标类型,这并不是我想要的。无论如何感谢您的回答!
    【解决方案2】:

    这几乎是可能的——你可以有一个成员函数模板,但它不能是virtual。因此,如果您觉得这没问题,请从声明中删除 virtual,然后就可以了。

    要了解为什么成员函数模板不能是virtual,想想最常见的虚成员函数实现——虚函数表。那是一张指向函数的指针表,为每个虚函数存储一个指针。一个虚拟成员函数模板需要存储多少个指针?一种用于convert&lt;char&gt;,一种用于convert&lt;wchar_t&gt;,一种用于convert&lt;int&gt;,一种用于convert&lt;int*&gt;,一种用于convert&lt;int**&gt;,一种用于convert&lt;std::vector&lt;int&gt; &gt;,一种用于...

    问题是可以从模板中实例化任意多个函数。没有办法为它们进行动态调度。 (请注意,类似的问题也出现在所有其他动态调度实现中——一个模板可能是无限多的函数)

    【讨论】:

    • 谢谢,这是编译器告诉我的。为什么不可能?我不明白泛型和虚拟之间的关系。
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2016-09-28
    • 2011-12-19
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多