下面的代码主要是为了一个字符串视图,目标模板实例化对象为
cmp 函数的作用是类似于
最后一行 (
代码(大大简化):
T={char, const char}
。cmp 函数的作用是类似于
strcmp
对视图进行比较。问题在于,虽然 char*
可以轻松转换为 const char*
,但我不知道如何让 SVec<char>
能够像 char*
转换为 const char*
一样容易地转换为 SVec<const char>
。最后一行 (
cout<<(cmp(rv, rvc));
) 无法编译。我必须显式地进行转换 (cmp(SVec<const char>(rv), rvc)
)。是否可以像 char*
到 const char*
的转换一样自动完成呢?代码(大大简化):
template <typename T>
class SVec {
protected:
T* begin_;
size_t size_;
public:
SVec(T* begin, size_t size) : begin_(begin), size_(size) {};
SVec(T* begin, T* end) : begin_(begin), size_(end-begin) {};
SVec(T* begin) : begin_(begin) { while (*(begin++)) {}; size_ = begin - 1 - begin_; }
//^null element indicates the end
///Conversion
operator SVec<const T>() const { return SVec<const T>(begin_, size_); }
};
//General lexicographic compare
template <typename T>
inline int cmp(const SVec<const T>& l, const SVec<const T> & r){
return 1;
}
//Char specialization
template <> inline int cmp<char>(const SVec<const char>& l, const SVec<const char>& r){
return 1;
}
//Explicit instantiation
template int cmp<char>(const SVec<const char>& l, const SVec<const char>& r);
#include <iostream>
int main(){
using namespace std;
char ar[] = "st";
SVec<char> sv = ar;
SVec<const char> svc = "str";
cout<<(cmp(SVec<const char>(sv), svc));
cout<<(cmp(sv, svc));
}
cmp(const SVec<const T>&
无法将const T
与行cmp(sv, svc)
中的char
匹配(没有T
使得const T
等于char
)。 - dypcmp<char>(...)
修复了它。 - Petr Skocik