我有一种机制,它使用函数重载将类型分解为基元。以下是该机制的示例:
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()
的重载。
我无法在media
和debug_media<media>
之间进行继承。是否可以保留两个重载的行为?
我已将示例代码放在ideone上。
答案 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);
}
}