c++.stlsoft - A vocabulary for "smart pointers"
- Matthew Wilson (50/50) Apr 02 2007 I'm working on some heavily STL-ified code, and have had cause to requir...
- Matthew Wilson (5/26) Apr 02 2007 should read:
- Adi Shavit (19/70) Apr 08 2007 For what it's worth, Boost's shared_ptr defines these typedefs:
- Matthew Wilson (21/21) Apr 11 2007 charset="iso-8859-1"
I'm working on some heavily STL-ified code, and have had cause to require that
ref_ptr instances be get()'ed via a converter policy, as in:
std::find_if( stlsoft::transformer(m_tokens.begin(), m_tokens.end(),
stlsoft::invoke_get<IToken_ptr>())
, stlsoft::transformer(m_tokens.end(), m_tokens.end(),
stlsoft::invoke_get<IToken_ptr>())
, std::bind1st(comstl::com_S_OK(comstl::is_same_object), token));
I've just implemented an invoke_get() function adaptor, as follows:
namespace stlsoft
{
template <typename T>
struct get_invoker
{
public:
typename T::element_type operator ()(T &t) const
{
return t.get();
}
};
template <typename T>
inline get_invoker<T> invoke_get()
{
return get_invoker<T>();
}
} // namespace stlsoft
To make this work (without traits), I've added the member type element_type to
ref_ptr, following on the lines of auto_ptr.
Naturally, this got me wondering about whether there exists a standard
vocabulary for (the member types of) "smart pointer" types, or more
specifically, those that are get()-able, i.e. have get() methods (with the
conventional semantics of exposing the managed resource to client code, in a
non-implicit fashion).
Within STLSoft there are get()-able facades and smart pointers for a wide
spectrum of different resource types, including the following
(facade/smart-ptr, with get() return type):
- comstl::bstr (BSTR)
- comstl::guid (GUID&)
- inetstl::connection (HINTERNET)
- inetstl::session (HINTERNET)
- stlsoft::auto_destructor (value_type*)
- stlsoft::ptr_proxy (value_type*)
- stlsoft::ref_ptr (counted_type*)
- stlsoft::scoped_handle (resource_type)
- stlsoft::shared_ptr (const_pointer)
- unixstl::module (module_handle_type)
- winstl::module (module_handle_type)
- winstl::reg_key/reg_key_sequence/reg_value_sequence (hkey_type)
Clearly this list shows that the STLSoft libraries are not consistent in the
name of the member type(s) that are returned by get()-able types.
My feeling is that the others should follow the example of scoped_handle, and
define a member type resource_type, e.g.
- comstl::bstr::resource_type === BSTR
- unixstl::module::resource_type === void*
- winstl::reg_key_sequence::resource_type === HKEY
and so on.
Does anyone have any comment on:
- what conventions exists for get()-able types' member types in other
libraries, in standards proposals/thinking
- whether it's even worth trying to establish a convention; you might consider
the effort fruitless and require the use of a traits class (that has an
undefined primary template)
- whether it's worth proposing a standard member type name, e.g.
resource_type, for the C++ standard for get()-able types (if such a proposal
has not already been done, of course)
- any other thoughts.
Cheers
Matthew
Apr 02 2007
Sorry. Typo. :$ Matthew Wilson Wrote:I'm working on some heavily STL-ified code, and have had cause to require that ref_ptr instances be get()'ed via a converter policy, as in: std::find_if( stlsoft::transformer(m_tokens.begin(), m_tokens.end(), stlsoft::invoke_get<IToken_ptr>()) , stlsoft::transformer(m_tokens.end(), m_tokens.end(), stlsoft::invoke_get<IToken_ptr>()) , std::bind1st(comstl::com_S_OK(comstl::is_same_object), token)); I've just implemented an invoke_get() function adaptor, as follows: namespace stlsoft { template <typename T> struct get_invoker { public: typename T::element_type operator ()(T &t) constshould read: typename T::element_type* operator ()(T &t) const{ return t.get(); } };<snip>
Apr 02 2007
For what it's worth, Boost's shared_ptr defines these typedefs:
template<class T> class shared_ptr
{
//...
public:
typedef T element_type;
typedef T value_type;
typedef T * pointer;
//...
Apparently scoped_ptr, static_move_ptr and others
<http://www.google.com/codesearch?hl=en&lr=&q=typedef+element_ty
e+_ptr&btnG=Search>
define element_type too.
Loki's SmartPtr <http://loki-lib.sourceforge.net/html/a00674.html>
defines the following (policy defined) typedefs: StoredType,
InitPointerType, PointerType, ReferenceType
But, perhaps you should post this question to one of the comp.lang.c++.*
groups.
Adi
Matthew Wilson wrote:
I'm working on some heavily STL-ified code, and have had cause to require that
ref_ptr instances be get()'ed via a converter policy, as in:
std::find_if( stlsoft::transformer(m_tokens.begin(), m_tokens.end(),
stlsoft::invoke_get<IToken_ptr>())
, stlsoft::transformer(m_tokens.end(), m_tokens.end(),
stlsoft::invoke_get<IToken_ptr>())
, std::bind1st(comstl::com_S_OK(comstl::is_same_object), token));
I've just implemented an invoke_get() function adaptor, as follows:
namespace stlsoft
{
template <typename T>
struct get_invoker
{
public:
typename T::element_type operator ()(T &t) const
{
return t.get();
}
};
template <typename T>
inline get_invoker<T> invoke_get()
{
return get_invoker<T>();
}
} // namespace stlsoft
To make this work (without traits), I've added the member type element_type to
ref_ptr, following on the lines of auto_ptr.
Naturally, this got me wondering about whether there exists a standard
vocabulary for (the member types of) "smart pointer" types, or more
specifically, those that are get()-able, i.e. have get() methods (with the
conventional semantics of exposing the managed resource to client code, in a
non-implicit fashion).
Within STLSoft there are get()-able facades and smart pointers for a wide
spectrum of different resource types, including the following
(facade/smart-ptr, with get() return type):
- comstl::bstr (BSTR)
- comstl::guid (GUID&)
- inetstl::connection (HINTERNET)
- inetstl::session (HINTERNET)
- stlsoft::auto_destructor (value_type*)
- stlsoft::ptr_proxy (value_type*)
- stlsoft::ref_ptr (counted_type*)
- stlsoft::scoped_handle (resource_type)
- stlsoft::shared_ptr (const_pointer)
- unixstl::module (module_handle_type)
- winstl::module (module_handle_type)
- winstl::reg_key/reg_key_sequence/reg_value_sequence (hkey_type)
Clearly this list shows that the STLSoft libraries are not consistent in the
name of the member type(s) that are returned by get()-able types.
My feeling is that the others should follow the example of scoped_handle, and
define a member type resource_type, e.g.
- comstl::bstr::resource_type === BSTR
- unixstl::module::resource_type === void*
- winstl::reg_key_sequence::resource_type === HKEY
and so on.
Does anyone have any comment on:
- what conventions exists for get()-able types' member types in other
libraries, in standards proposals/thinking
- whether it's even worth trying to establish a convention; you might
consider the effort fruitless and require the use of a traits class (that has
an undefined primary template)
- whether it's worth proposing a standard member type name, e.g.
resource_type, for the C++ standard for get()-able types (if such a proposal
has not already been done, of course)
- any other thoughts.
Cheers
Matthew
Apr 08 2007
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
"Adi Shavit" <adish gentech.co.il> wrote in message =
news:evbm3f$2v8o$1 digitalmars.com...
For what it's worth, Boost's shared_ptr defines these typedefs:
template<class T> class shared_ptr
{
//...
public:
typedef T element_type;
typedef T value_type;
typedef T * pointer;
//...Apparently scoped_ptr, static_move_ptr and others define =
element_type too.
Loki's SmartPtr defines the following (policy defined) typedefs: =
StoredType, InitPointerType, PointerType, ReferenceType
But, perhaps you should post this question to one of the =
comp.lang.c++.* groups.
I did. Just didn't get much in the way of interest.No matter, I've =
decided on resource_type and const_resource_type (with the latter being =
optional, and inferrable from resource_type).
Apr 11 2007









Matthew Wilson <no-one nowhere.no.com> 