c++ - 包装一个类型,但保留其关于函数重载的行为?

标签 c++ templates c++11 overloading

我有一种使用函数重载将类型分解为基元的机制。这是该机制的示例:

template <typename M, typename T> void process(M&, T&);

template <typename M, typename T>
void process_impl(M& m, const T& t) {
  m.write(t);
}
template <typename M, typename T>
void process_impl(M& m, const std::vector<T>& v) {
  for (const auto& t: v) {
    process(m, t);
  }
}

template <typename M, typename T>
void process(M& m, const T& t) {
  process_impl(m, t);
}

用例是将类型提供给 process() ,它将使用 process_impl() 的重载将其分解为简单类型.为了自定义 process() 的行为对于特定类型,只需重载 process() :

struct media {
  template <typename T> void write(const T& t) { std::cout << t << std::endl; }
};
void process(media& m, const std::string& s) {
  process(m, s.size());
}

这段代码:

media m;
process(m, std::vector<std::string>{"1", "22"});

输出:

1
2

现在,我想包装 media在一个类中,这样我就可以进一步调整 process() 的行为对于我的包装器结构,但我想保留 process() 的初始行为关于 media :

template <typename M>
struct debug_media {
  template <typename T> void write(const T& t) { m.write(t); }

  M m;
};
template <typename M, typename T>
void process(debug_media<M>& d, const T& t) {
  std::cout << "debug: ";
  process(d.m, t);
}

理想情况下,我希望输出为:

debug: 1
debug: 2

但事实并非如此,因为 debug_media 的过载只使用一次,用于第一次调用;之后,process() 的重载接受 media被使用,而不是带有 debug_media<media> 的那个.

我不能在 media 之间继承和 debug_media .是否可以保留两个重载的行为?

我已将示例代码放在 ideone 上.

最佳答案

您可以添加额外的重载:

template <typename M, typename T> void process(debug_media<M>& d, const std::vector<T>& v)
{
    for(const auto& t : v) {
        process(d, t);
    }
}

Live example

关于c++ - 包装一个类型,但保留其关于函数重载的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27041275/

相关文章:

c++ - 为什么 std::less<Eigen::VectorXd> 编译失败?

c++ - Linux下Intel CPU/GPU上的OpenCL开发

c++ - 如何调用类中定义的友元模板函数?

wordpress - 在wordpress中使用index.php而不是single.php加载单页

c++ - 派发良好模板功能的最佳方式

c++ - 单击按钮调用 onPaint()

C++:这个 while 循环有什么问题?

c++ - 如何为相等的模板参数类型专门化/重载函数?

c++ - 如果我们使用 SFINAE 匹配类型,则完全失败

c++ - 从真值到 std::true_type 的隐式转换