Boost :: вариант <T>в стандартную строку :: строка - PullRequest
8 голосов
/ 08 декабря 2010

У меня есть вариант усиления, который выглядит следующим образом: typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;

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

Или какой самый эффективный способ?

В настоящее время я бы реализовал несколько перегруженных функций, каждая из которых принимает тип, а затем выполняетпреобразование с использованием std::stringstream или posix_time я бы использовал функцию преобразования.Возможно, есть лучший способ?

Ответы [ 4 ]

9 голосов
/ 08 декабря 2010

Используйте boost :: lexical_cast , который скрывает всю вещь stringstream за удобной оболочкой. Это также работает с boost :: posix_time, так как имеет подходящий operator<<.

3 голосов
/ 08 декабря 2010

Попробуйте это:

struct to_string_visitor : boost::static_visitor<>
{
  std::string str; 

  template <typename T>
  void operator()(T const& item)
  {
    str = boost::lexical_cast<std::string>(item);
  }
  void operator()(boost::posix_time::ptime const & item)
  {
    //special handling just for ptime
  }
};

int main(){
  variant v = 34;
  to_string_visitor vis;
  boost::apply_visitor(vis, v);
  cout << vis.str << endl;
}
1 голос
/ 08 декабря 2010

См. , как правило, конвертировать из boost :: variable в тип Вы должны быть в состоянии адаптировать этот ответ к вашей ситуации.Вы можете использовать boost::lexical_cast для всех ваших типов, кроме boost::posix_time::ptime, где вам, вероятно, потребуется специальное решение.Все это в static_visitor с использованием перегрузки операторов (шаблон + один для ptime).

0 голосов
/ 08 декабря 2010

Более чистый и элегантный (но не более эффективный) способ преобразования определенного типа в std::string заключается в использовании

template<typename Target, typename Source> Target lexical_cast(const Source& arg);

из

#include <boost/lexical_cast.hpp>

Тип, который необходимо преобразовать, должен предоставлять обычный оператор «<<» для ostream. </p>

пример использования: std::string s = boost::lexical_cast<std::string>( 17 ); assert( s == "17" );

...