2

我可以重载 std::string 构造函数吗?

我想创建一个构造函数,它接受 std::wstring 并返回一个 std::string。有可能吗?怎么做?

谢谢。

4

4 回答 4

3

我可以重载 std::string 构造函数吗?

不,它需要更改std::string声明。

我想创建一个构造函数,它接受 std::wstring 并返回一个 std::string。有可能吗?怎么做?

您可以使用转换功能,例如:

std::string to_string(std::wstring const& src);

但是,您需要决定如何处理无法使用 8 位编码表示的符号std::string:是将它们转换为多字节符号还是抛出异常。请参阅wcsrtombs函数。

于 2012-02-13T14:27:59.903 回答
2

而是定义一个自由函数:

std::string func(const std::wstring &)
{
}
于 2012-02-13T14:24:46.277 回答
1

不,您不能将任何新的构造函数添加到std::string. 您可以做的是创建一个独立的转换函数:

std::string wstring_to_string(const wstring& input)
{
    // Your logic to throw away data here.
}

如果您(认为您)希望这种情况自动发生,我强烈建议您重新评估该想法。你会给自己带来大量的头痛,因为s 会在你最不期望的时候wstring被自动处理。string

于 2012-02-13T14:29:17.127 回答
0

这不是正确的做法,我认为我在编写此代码时抽了一些东西,但它解决了问题。检查最后一个函数“convert_str”。

#pragma once    

#include <memory>
#include <string>
#include <vector>

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/type_traits/remove_pointer.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/logical.hpp>

template <typename Target, typename Source, typename cond>
struct uni_convert {
};

template <typename Target, typename Source > 
struct uni_convert<Target,Source,
    typename boost::enable_if< boost::is_same<Target, Source>, int >::type > {
    static Target doit(Source const& src) 
    {

        return src;
    }
};

template <typename Cond > 
struct uni_convert<std::string,std::wstring,
    Cond > {
    static std::string doit(std::wstring const& src) 
    {
        std::vector<char> space(src.size()*2, 0);
        wcstombs( &(*( space.begin() )), src.c_str(), src.size()*2 );
        std::string result( &(*( space.begin() )) );
        return result;
    }
};

template <typename Cond > 
struct uni_convert<std::wstring,std::string,
    Cond > {
    static std::wstring doit(std::string const& src) 
    {
        std::vector<wchar_t> space(src.size()*2, 0);
        mbstowcs( &(*( space.begin() )), src.c_str(), src.size()*2 );
        std::wstring result( &(*( space.begin() )) );
        return result;
    }
};

template< typename TargetChar >
std::basic_string< TargetChar > convert_str( std::string const& arg)
{
    typedef std::basic_string< TargetChar > result_t;
    typedef uni_convert< result_t, std::string, int > convertor_t;
    return convertor_t::doit( arg );
}
于 2012-02-13T14:55:35.777 回答