我有一个包含单个wstring的类。
我有2个打印功能,一个用于ostream
,另一个用于wostream
。
我必须像这样使用它们:
MyClass<char> s;
s.push_back( 'H' );
s.push_back( 'i' );
//Printing with ostream
s.print( std::cout );
MyClass<wchar_t> w;
w.push_back( L'C' );
w.push_back( L'+' );
//Printing with wostream
w.print( std::wcout );
我的问题是,我无法使用ostream
功能,这是我的班级:
template<typename T>
MyClass{
private:
std::wstring *data;
public:
void push_back(const T& t) {
data->push_back(t);
}
//Does not work
void print(std::ostream& out) const{
out<<*data; //Results in a compile error
}
//Does work verry well
void print(std::wostream& out) const {
out << *data;
}
};
我怎么能做到这一点?
P.S。:我知道这是胡说八道,但实际上这是我去年的学校考试。所以我无法改变标准。这是任务。
答案 0 :(得分:8)
问题在于,无论模板类型std::wstring
是T
还是char
,您都要存储wchar_t
。相反,您希望使用具有适当类型的模板std::basic_string
:
std::basic_string<T> *data;
std::string
只是std::basic_string<char>
的typedef,std::wstring
只是std::basic_string<wchar_t>
的typedef。
同样,std::ostream
只是std::basic_ostream<char>
的typedef,std::wostream
只是std::basic_ostream<wchar_t>
的typedef,因此您可以拥有一个print
函数在适当的类型上采用std::basic_ostream
模板。
答案 1 :(得分:4)
存储正确类型的字符串
std::basic_string<T> data;
并重载只有正确的basic_ostream
专精,而不是ostream
和wostream
:
void print(std::basic_ostream<T> & out) const {
out << data;
}
(另外,存储字符串本身而不是未初始化的指针会产生更好的结果)。