我正在用C ++创建一个固定长度的字符串类库,用于内存有限的设备。我的想法是我可以声明像fixed_string< 10>这样的变量。这将产生一个长度为11的结构(以保留关闭的空间' \ 0',但这将对用户隐藏)。
结构如下:
template<int N> class fixed_string ;
template<>
class fixed_string<0>
{
. . .
}
template<int N>
class fixed_string : public fixed_string<0> {
. . .
}
我正在尝试在实现&lt; 0&gt;中调整任何运算符重载:
template<>
class fixed_string<0>
{
fixed_string & operator+= ( const char ch ) {
append(ch);
return *this;
}
fixed_string & operator+= ( const fixed_string & fs) {
for(char ch : fs)
append(ch);
return *this;
}
}
我可以使用以下声明创建fixed_length字符串:
fixed_string<20> fs1('e');
fixed_string<10> fs2('d');
现在我可以做到以下几点:
fs1 += fs2;
编译器为我创建了一个方法fixed_string<0>::operator+=(fixed_string<0> const&)
,它适用于任何fixed_string<N>
上的所有操作。
我的问题在于赋值运算符,因为它需要一个正确的返回类型:
fixed_string & operator= ( const fixed_string & rhs) {
fixed_string::reset();
return *this += rhs;
}
我可以使用显式转换来调用此函数
(fixed_string<0>) fs = (fixed_string<0>) fs2;
但这不是非常用户友好。另一种解决方案如下:
template<int N>
class fixed_string : public fixed_string<0> {
. . .
template<int M>
fixed_string<N> & operator= ( const fixed_string<M> & rhs) {
reset();
return *this += rhs;
}
. . .
}
但是这产生了无数的函数(由模板实例化时的编译器提供)fixed_string<10>& fixed_string<10>::operator=<20>(fixed_string<20> const&)
允许我这样做
fs = fs2;
但我不想拥有无数的功能。
有没有办法为我的库提供自动转换,所以我没有无数的分配操作符函数而不强迫用户将每个fixed_string强制转换为fixed_string&lt; 0&gt; ?
谢谢,
马丁
答案 0 :(得分:0)
忽略你的奇怪设计(而不是继承零长度的字符串,为什么不只是创建一个普通的类,称之为fixed_string_base,并将所有函数[和可能的变量]放在那里?),你可以只提供用户定义的转换 - http://en.cppreference.com/w/cpp/language/cast_operator
template<int N>
class fixed_string : public fixed_string<0> {
...
operator fixed_string<0>() const
{
...
}
...
}
你也可以在N!= 0的类中提供赋值运算符,而在“inside”这些函数中,只有执行 - 编译器会内联(如果启用优化),问题也会解决。