下面这段代码主要用于字符串视图,其中T={char, const char}
是主要预期的模板实例化目标。自动转换模板< T>至模板<const T>
cmp函数应该类似于strcmp
比较视图。 问题是,虽然char*
愉快地转换为const char*
我不知道如何得到SVec<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&'无法在'cmp(sv,svc)'行中将'const T'与'char'进行匹配(不存在'T'这样的'const T'等于'char') –
dyp
@dyp谢谢。'cmp(...)'修复了它。 –
PSkocik
@dyp你可以做出答案吗? –