boost assign list_of не работает с двойными литералами?

#c #boost

#c #boost

Вопрос:

Я хочу использовать boost list_of для инициализации a vector<double> , но, похоже, вектор заканчивается целочисленными значениями.

Я начинаю с примера здесь: http://www.boost.org/doc/libs/1_55_0b1/libs/assign/doc/index.html#complicated и измените значение score_type на vector<double> и добавьте несколько литералов с плавающей запятой. Вот новый код:

 #include <boost/assign/list_of.hpp>
#include <boost/assign/list_inserter.hpp>
#include <boost/assert.hpp>
#include <string>
#include <vector>
#include <map>


using namespace std;
using namespace boost::assign;

int main()
{
  typedef vector<double>                   score_type;
  typedef map<string,score_type>        team_score_map;
  typedef pair<string,score_type>       score_pair;

  team_score_map group1, group2;
  //
  // method 1: using 'insert()'
  //
  insert( group1 )( "Denmark", list_of(1.1)(1) )
    ( "Germany", list_of(0)(0) );
  BOOST_ASSERT( group1.size() == 2 );
  BOOST_ASSERT( group1[ "Denmark" ][1] == 1 );
  BOOST_ASSERT( group1[ "Denmark" ][0] == 1.1 );

  //
  // method 2: using 'list_of()'
  //
  group2 = list_of< score_pair >
    ( "Norway",  list_of(1)(5.9) )
    ( "Andorra", list_of(1)(1) );
  BOOST_ASSERT( group2.size() == 2 );
  BOOST_ASSERT( group2[ "Norway" ][0] == 1 );
  BOOST_ASSERT( group2[ "Norway" ][1] == 5 );
  BOOST_ASSERT( group2[ "Norway" ][1] == 5.9 );

  return 0;
}
  

Последнее утверждение метода 1 insert работает нормально, но последнее утверждение метода 2 list_of завершается ошибкой. Я пытался инициализировать с ((double)5.9) помощью и (5.9f) безрезультатно.

Думаю, сейчас я могу обойти проблему, используя insert .

Мысли?

Спасибо.

(Я знаю о списке инициализаторов C 11, но я хочу понять, что здесь происходит.)

Ответ №1:

Если вы не указываете list_of , какой тип ожидать, он угадывает с первого вызова:

 list_of
    (0) // int
    (0.5) // oops, already decided int
  

Вы можете указать:

 list_of<double>(1)(5.9)
  

Или вы можете убедиться, что первого вызова достаточно, чтобы угадать:

 list_of(1.0)(5.9)
  

Комментарии:

1. Ах! Я должен был посмотреть на заголовок list_of. Спасибо.