是否可以用C ++编写自定义转换操作符(如`static_cast`)?

时间:2015-12-15 11:05:15

标签: c++ casting

我得到了这个想法,并尝试编写一个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 ++中是不可能的,还是我在代码中遗漏了什么?

3 个答案:

答案 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,则可以创建InSizeOutSize typedef

答案 2 :(得分:1)

虽然我同意Jarod42的回答是更好的方法。您收到错误的原因是您尝试使用没有对象的转换运算符。

string_cast<wchar_t>(AString)

是尝试调用接受std::string&的c。您的代码段需要以下语法。

string_cast<wchar_t>()(AString)注意额外的()对,这是对象创建。