如何获取基类的模板类型

1 c++ templates template-meta-programming

C++标准或C++标准库中的内容将实现get_base_template_arg<>本示例中的操作?

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) { /* ... */ }
};
Run Code Online (Sandbox Code Playgroud)

这样我就可以做到:

mediator m{};
request1 r{};
int x = m.send(r);
Run Code Online (Sandbox Code Playgroud)

编辑: 谢谢Brian的回答; 完整的解决方案可能如下所示:

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`
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 6

将模板参数公开为typedef通常很有用:

template <typename TResponse>
class request {
  public:
    using ResponseType = TResponse;
}
Run Code Online (Sandbox Code Playgroud)

然后,为了得到你想要的类型TRequest,你可以写typename TRequest::ResponseType; 成员名称将在基类中找到.