Как перегрузить оператор << для использования с выходным значением по умолчанию boost :: program_options? - PullRequest
2 голосов
/ 02 марта 2012

Я использую boost :: program_options и хочу передать "доменные" опции моей программе. Такой домен просто:

template<typename T>
struct CDomain
{
  CDomain(T min = -1, T max = 1) {_min = min; _max = max;};
  T _min;
  T _max;
};

Я написал собственный валидатор для этого класса опций, и он работает хорошо. Теперь, когда я хотел добавить значение по умолчанию, как в

desc.add_options()("domain", po::value<CDomain<long double> >()->default_value(CDomain<long double>(-1,1)), "domain");

boost :: program_options вызывается для оператора <<: </p>

error: no match for ‘operator<<’ in ‘stream << input’

Я добавил это, но все равно получаю то же сообщение об ошибке:

template<typename T>
ostream& operator<<(ostream& o, CDomain<T>& d)
{
  return o << "[" << boost::lexical_cast<string>(d._min) << ":" << boost::lexical_cast<string>(d._max) << "]";
}

Как определить оператор << для использования с выводом значения по умолчанию в описаниях пользовательских опций? </p>


Я провел еще несколько расследований. Ошибка возникает в boost/lexical_cast.hpp:1147 In member function bool boost::detail::lexical_stream_limited_src<CharT, Traits, RequiresStringbuffer>::shl_input_streamable(InputStreamable&) [with InputStreamable = const CDomain<long double>, CharT = char, Traits = std::char_traits<char>, bool RequiresStringbuffer = true]:

template<typename InputStreamable>
bool shl_input_streamable(InputStreamable& input)
{
    std::basic_ostream<CharT> stream(&stringbuffer);
    bool const result = !(stream << input).fail();
    start = stringbuffer.pbase();
    finish = stringbuffer.pptr();
    return result && (start != finish);
}

Это может быть проблема пространства имен, но перемещение ostream& operator<<(ostream& o, CDomain<T>& d) в boost :: detail не решило проблему.

1 Ответ

2 голосов
/ 02 марта 2012

Переопределите вашу структуру аналогичным образом:

template<typename T>
struct CDomain
{
  CDomain(T min = -1, T max = 1) {_min = min; _max = max;};
  T _min;
  T _max;

  friend std::ostream& operator << (std::ostream& s, const CDomain& domain)
  {
    so << "[" << boost::lexical_cast<string>(d._min) << ":" << boost::lexical_cast<string>(d._max) << "]"
    return s;
  }
};

Это должно решить проблему, в которую я верю. Здесь Я вижу, как он работает (модифицированная версия, чтобы он работал в Интернете).

...