16 Şubat 2018 Cuma

karma epsilon

Giriş
Çıktı vermek yerine daha çok bir fonksiyonun çağrılması için kullanılır.,

Örnek
Elimizde bir boost::optional olsun
using FooVariant = boost::variant<int, double>;
using FooOptional = boost::optional<FooVariant>;
Şöyle yaparız.
template<typename OutputIt = boost::spirit::ostream_iterator>
struct FooGenerator
    : boost::spirit::karma::grammar<OutputIt, FooOptional()>
{
  FooGenerator()
    : FooGenerator::base_type(start_)
  {
    namespace bsk = boost::spirit::karma;
    namespace phx = boost::phoenix;

    foovar_ = bsk::int_ | bsk::double_;
    start_ = '[' << (bsk::eps(is_initialized_(bsk::_val)) | '*') << -foovar_ << ']';
  }

private:
  struct is_initialized_f {
    template<typename T>
    bool operator()(boost::optional<T> const& opt) const { return opt.is_initialized(); }
  };
  boost::phoenix::function<is_initialized_f> is_initialized_;
  boost::spirit::karma::rule<OutputIt, FooVariant()> foovar_;
  boost::spirit::karma::rule<OutputIt, FooOptional()> start_;
};
Şöyle yaparız.
for (FooOptional fop : { FooOptional{}, {FooVariant{123}}, {FooVariant{3.14}} }) {
  if (std::cout << boost::spirit::karma::format(FooGenerator<>(), fop))
    std::cout << "\n";
  else
  {
    std::cout.clear();
    std::cout << "#Error\n";
  }
}
Çıktı olarak şunu alırız.
[*]
[123]
[3.14]

Hiç yorum yok:

Yorum Gönder