Boost logo

Boost :

Subject: [boost] [result_of] Usage guidelines
From: Andrey Semashev (andrey.semashev_at_[hidden])
Date: 2012-09-03 03:08:56


Hi,

I wonder what is the correct way of declaring polymorphic function
object result types and how to use result_of template with regard to
argument types. If a function object receives arguments by reference,
should its member result<> template be specialized for reference types
as well? Also, should result_of<> for this function be instantiated
with reference argument types?

  struct my_foo
  {
    template< typename > struct result;

    // Is this correct?
    template< typename ArgT >
    struct result< my_foo(ArgT) >
    {
      typedef ArgT type;
    };

    // Or is this correct?
    template< typename ArgT >
    struct result< my_foo(ArgT const&) >
    {
      typedef ArgT type;
    };

    template< typename ArgT >
    ArgT operator() (ArgT const& arg) const
    {
      return arg;
    }
  };

I realize that I can provide both result<> specializations and it will
work either way. But when there are more than one argument the
specializations begin to pile quickly. Consider also rvalue references
and const and non-const qualified my_foo.

Another question I have is how to use result_of<> when my_foo is
external (i.e. provided by a third party library)?

  // Which one is the right way?
  typedef result_of< my_foo(int) >::type result_type1;
  typedef result_of< my_foo(int const&) >::type result_type2;

I cannot know what result<> specializations are provided by my_foo, so
probably there isn't an ultimate answer. But perhaps there are some
guidelines or best practices? I've looked at result_of docs but there
are no recommendations on this.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk