我得到了这个想法,并尝试编写一个string_cast
转换运算符来在C ++字符串之间进行转换。
template <class OutputCharType>
class string_cast
{
public:
template <class InputCharType>
operator std::basic_string<OutputCharType>(const std::basic_string<InputCharType> & InputString)
{
std::basic_string<OutputCharType> OutputString;
const std::basic_string<InputCharType>::size_type LENGTH = InputString.length();
OutputString.resize(LENGTH);
for (std::basic_string<OutputCharType>::size_type i=0; i<LENGTH; i++)
{
OutputString[i] = static_cast<OutputCharType>(OutputString[i]);
}
return OutputString;
}
};
我试着像这样使用它:
std::string AString("Hello world!");
std::cout << AString << std::endl;
std::wcout << string_cast<wchar_t>(AString) << std::endl; // ERROR
错误消息是:
Error C2440 '<function-style-cast>': cannot convert from
'const std::string' to 'string_cast<wchar_t>'
这在C ++中是不可能的,还是我在代码中遗漏了什么?
答案 0 :(得分:7)
您可以使用签名编写免费功能:
template <typename OutputCharType, typename InputCharType>
std::basic_string<OutputCharType>
string_cast(const std::basic_string<InputCharType>& InputString)
答案 1 :(得分:3)
看起来你只想要一个非成员函数而不是一个函子:
template <class OutputCharType, class InputCharType>
std::basic_string<OutputCharType>
string_cast(const std::basic_string<InputCharType> & InputString)
{
std::basic_string<OutputCharType> OutputString;
const auto LENGTH = InputString.length();
OutputString.resize(LENGTH);
for (auto i=0; i<LENGTH; i++)
{
OutputString[i] = static_cast<OutputCharType>(OutputString[i]);
}
return OutputString;
}
另请注意,我已将size_type
类型更改为auto
。这是因为它们是从属名称,因此您需要使用typename
将它们用作类型(MSVC可能会让您在没有它的情况下逃脱,但这不可移植):
const std::basic_string<InputCharType>::size_type LENGTH = InputString.length();
//change to
const typename std::basic_string<InputCharType>::size_type LENGTH = InputString.length();
// ^^^^^^^^
这非常难看,所以最好只使用auto
。如果您无法使用C ++ 11,则可以创建InSize
和OutSize
typedef
。
答案 2 :(得分:1)
虽然我同意Jarod42的回答是更好的方法。您收到错误的原因是您尝试使用没有对象的转换运算符。
string_cast<wchar_t>(AString)
是尝试调用接受std::string&
的c。您的代码段需要以下语法。
string_cast<wchar_t>()(AString)
注意额外的()
对,这是对象创建。