Перегрузка конструктора std :: string - PullRequest
1 голос
/ 13 февраля 2012

Могу ли я перегрузить конструктор std :: string?

Я хочу создать конструктор, который принимает std :: wstring и возвращает std :: string.это возможно и как?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 13 февраля 2012

Можно ли перегрузить конструктор std :: string?

Нет, потребуется изменить объявление std::string.

Я хочу создать конструктор, который принимает std :: wstring и возвращает std :: string. это возможно и как?

Вместо этого вы можете использовать функцию преобразования, например:

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

Однако вам нужно решить, что делать с символами, которые нельзя представить, используя 8-битовое кодирование std::string: преобразовать ли их в многобайтовые символы или сгенерировать исключение. См. wcsrtombs функция.

2 голосов
/ 13 февраля 2012

Скорее определите свободную функцию:

std::string func(const std::wstring &)
{
}
1 голос
/ 13 февраля 2012

Нет, вы не можете добавлять новые конструкторы в std::string.То, что вы можете сделать, - это создать отдельную функцию преобразования:

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

Если вы (думаете, что хотите), чтобы это произошло автоматически, я настоятельно рекомендую переоценить эту идею.Вы будете вызывать у себя значительное количество головных болей, поскольку wstring s автоматически рассматриваются как string, когда вы меньше всего этого ожидаете.

0 голосов
/ 13 февраля 2012

Это не правильный верный способ сделать это, и я думаю, что я что-то курил, когда кодировал это, но это решает проблему.Проверьте последнюю функцию `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 );
}
...