user8782808
user8782808

Reputation:

How to get template type of base class

What in the C++ standard or C++ standard library will achieve what get_base_template_arg<> is doing in this example?

template <typename TResponse>
class request {};

class request1 : public request<int> {};

class mediator {
 public:
  template <typename TRequest, typename TResponse
     = get_base_template_arg<TRequest>::type>
  TResponse send(TRequest r) { /* ... */ }
};

such that I can do:

mediator m{};
request1 r{};
int x = m.send(r);

EDIT: thank you to Brian's answer; a complete solution may look like:

template <typename TResponse>
class request {
 public:
  using response_type = TResponse;
};

class request1 : public request<int> {};

class mediator {
 public:
  template<typename TRequest,
    typename TResponse = typename TRequest::response_type>

  TResponse send(const TRequest& r) { /* ... */ }
};


// usage:
mediator m{};
request1 r{};
auto x = m.send(r); // x is inferred `int`

Upvotes: 1

Views: 1442

Answers (1)

Brian Bi
Brian Bi

Reputation: 119034

It is often useful to expose the template parameter as a typedef:

template <typename TResponse>
class request {
  public:
    using ResponseType = TResponse;
}

Then, to get the type you want from TRequest, you can just write typename TRequest::ResponseType; the member name will be found in the base class.

Upvotes: 7

Related Questions