隐式模板重载

时间:2014-11-21 15:00:04

标签: c++ templates casting operator-overloading implicit-conversion

我正在用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; ?

谢谢,

马丁

1 个答案:

答案 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”这些函数中,只有执行 - 编译器会内联(如果启用优化),问题也会解决。