Defining Client Side Representation Classes

Often it is very convenient to define a separate type for a component which can be used on the client side (from where the component is instantiated and used). This step might seem as unnecessary duplicating code, however it significantly increases the type safety of the code.

A possible implementation of such a client side representation for the component described in the previous section could look like:

#include <hpx/include/components.hpp>

namespace app
    // Define a client side representation type for the component type
    // 'some_component' defined in the previous section.
    struct some_component_client
      : hpx::components::client_base<some_component_client, some_component>
        using base_type = hpx::components::client_base<
                some_component_client, some_component>;

        some_component_client(hpx::future<hpx::id_type> && id)
          : base_type(std::move(id))

        hpx::future<int> some_member_function(std::string const& s)
            some_component::some_member_action act;
            return hpx::async(act, get_id(), s);

A client side object stores the global id of the component instance it represents. This global id is accessible by calling the function client_base<>::get_id(). The special constructor which is provided in the example allows to create this client side object directly using the API function hpx::new_<>().