Boost logo

Boost Users :

Subject: Re: [Boost-users] 'Hashable' concept for type erasure
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2014-03-22 20:47:27


AMDG

On 03/22/2014 05:13 PM, Samuel Christie wrote:
> Hmm. Maybe it would be best if I make a custom wrapper class anyway, then.
> All I really need is the ability to 1) record 'seen' objects in the
> history, and 2) be able to tell whether one of the same objects is in the
> history or not. Up until this point, I've been using unordered_sets, but I
> was hoping to support more sophisticated memory models that would only
> remember recent history, for instance.
>
> Of those choices, I think (b) makes the most sense for my purposes, though
> a or c would also be acceptable. I can't really see how I would achieve
> that with just type erasure though. This could easily be a case of an
> over-used hammer.
>

Do you actually need to erase the value_type?
If you can use has_count<size_t(int)>, then
everything will just work.

> If you don't mind my asking, which of them would you recommend, which do
> you think is achievable with type-erasure, and what other alternatives do
> you think I should be considering?
>

If it were just count, I would go for (b). However,
that isn't an option for insert, since it's impossible
to insert something that isn't an int into a container
that stores ints. Whether consistency between the
functions is more important than the extra convenience,
only you can decide. Now that I think about it, all these
options can all be implemented in basically the same way
(you will need typeid_<_value> for this to work):

template<class T>
std::size_t generic_count(const any_set& c, const T& t)
{
  typedef any<requirements, const _value&> val_ref;
  // check that the type of t matches the value_type
  // of the container.
  if(typeid_of<_value>(binding_of(c)) == typeid(t)) {
    // capture the value in a way that's compatible
    // with the container.
    val_ref v(t, binding_of(c));
    return c.count(v);
  } else {
    return 0; // or throw or whatever
  }
}

You can put this directly in the concept_interface,
if you define it manually instead of using
BOOST_TYPE_ERASURE_MEMBER.

In Christ,
Steven Watanabe


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net