David Kimura created GEODE-3972:
-----------------------------------

             Summary: Disambiguate the Region interface template resolutions
                 Key: GEODE-3972
                 URL: https://issues.apache.org/jira/browse/GEODE-3972
             Project: Geode
          Issue Type: Improvement
          Components: native client
            Reporter: David Kimura


Region interface has unintuitive template type resolution.  For example: 
{{Region::put}} has following signatures:

{noformat}
    virtual void put(const CacheableKeyPtr& key, const CacheablePtr& value, 
const SerializablePtr& aCallbackArgument = nullptr) = 0;

    template <class KEYTYPE, class VALUETYPE>
    inline void put(const KEYTYPE& key, const VALUETYPE& value, const 
SerializablePtr& arg = nullptr) {
      put(createKey(key), createValue(value), arg);
    }
  
    template <class KEYTYPE>
    inline void put(const KEYTYPE& key, const CacheablePtr& value, const 
SerializablePtr& arg = nullptr) {
      put(createKey(key), value, arg);
    }
  
    template <class VALUETYPE>
    inline void put(const CacheableKeyPtr& key, const VALUETYPE& value, const 
SerializablePtr& arg = nullptr) {
      put(key, createValue(value), arg);
    }
{noformat}

If user calls {{region.put(a_key, CacheableString::create("a_value"), ...)}} 
they might expect it to call non-templated put since CacheableString derives 
from Cacheable.  Instead it seems to call the templated method.  Ideally, we 
should probably have our API match non-templated method signature in this 
particular case.

One solution may be to use type traits.  So, template signature on put 
interface may look something like:

{noformat}
template <class KEYTYPE, class VALUETYPE>
inline void put(
  const typename std::enable_if<is_integral_or_char_ptr<KEYTYPE>::value>::type& 
key = 0,
  const typename 
std::enable_if<is_integral_or_char_ptr<VALUETYPE>::value>::type& value = 0,
  const SerializablePtr& arg = nullptr) {
{noformat}

And then implement {{is_integral_or_char_ptr}}.  We should then evaluate 
whether {{createValue}} and {{createKey}} templates are needed any longer.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to