包装类型,但保留其关于函数重载的行为?

时间:2014-11-20 13:53:00

标签: 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()对我的包装器结构的行为,但我想保留{{1}的初始行为关于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的{​​{1}}的重载,而不是process()的重载。

我无法在mediadebug_media<media>之间进行继承。是否可以保留两个重载的行为?

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

1 个答案:

答案 0 :(得分:1)

您可以添加额外的重载:

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