Reputation:
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
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