c++ - 如何获取基类的模板类型

标签 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) { /* ... */ }
};

我可以做到:

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

编辑: 谢谢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`

最佳答案

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

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

然后,要从TRequest 中获取您想要的类型,您只需编写typename TRequest::ResponseType;成员名称将在基类中找到。

关于c++ - 如何获取基类的模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48161321/

相关文章:

c++ - 将自身传递给其他类的构造函数的类,两者均使用模板定义

c++ - 获取 std::tuple 满足特征的第一个元素

c++ - 如何使用不同的函数计算三个数字的总和、平均值和乘积

c++ - 如何将结构 vector 写入 json 文件?

c++ - std::function、文字类型和模板

c++ - 如何为具有类型删除数据成员的类实现复制构造函数?

c++ - 在编译时填充 std::set?

c++ - 结构和类

c++ - 二叉树和特殊节点打印

javascript - 我们可以在 Controller 中访问 Ember.TEMPLATES 吗?