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)