C++模板方法
C++ template method
我写了一个简化版的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功能。
这几乎是可能的 - 你可以有一个成员函数模板,但它不能virtual
。因此,如果这对您来说没问题,请从声明中删除virtual
,您就设置好了。
要了解为什么不能virtual
成员函数模板,请考虑虚拟成员函数最常见的实现 - 虚拟函数表。这是一个指向函数的指针表,为每个虚拟函数存储一个指针。虚拟成员函数模板需要存储多少个指针?一个用于convert<char>
,一个用于convert<wchar_t>
,一个用于convert<int>
,一个用于convert<int*>
,一个用于convert<int**>
,一个用于convert<std::vector<int> >
,一个用于...
问题是可以从模板实例化任意许多函数。没有办法为他们做动态调度。(请注意,在所有其他动态调度实现中也会出现类似的问题 - 模板只是潜在的无限多个函数(
为什么不添加一个模板化的构造函数呢?
template<typename chrT>
class strT
{
public:
template<typename otherT>
strT(otherT* o) { ... }
}
若要实现转换,可以将构造函数专用于chrT
和otherT
的不同可能性
相关文章:
- 将成员函数指针作为参数传递给模板方法
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- C++11:模板方法的模板函数调用无法编译?
- 如何从ECS中的模板方法获取组件?
- 使用 SFINAE 设计模板方法
- 一个模板方法,用于同时接受常量和非常量参数
- C++模板方法中的循环依赖关系
- 在 C++ 中使用模板方法重写类方法
- 类中的模板方法
- 基于枚举参数调用专用模板方法
- 模板中的模板方法 - 实例声明和类方法声明签名不同
- 可变参数模板方法
- 使用模板方法为标头提供空 cpp 时出现问题
- SFINAE 方法在 clang 中完全禁用基类的模板方法
- 将函数和成员函数传递给模板方法
- 从非模板类调用专用模板方法
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- 依赖于特定类类型的C++模板方法
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- 如何避免模板方法的循环依赖