在C ++中,我最终会得到像这样的实用程序类:
struct time_ref
{
time_ref(FILETIME & ft) : ftval(&ft), ttval(0) {}
time_ref(time_t & tt) : ttval(&tt), ftval(0) {}
FILETIME * ftval;
time_t * ttval;
}
他们依赖于implcit转换,例如减少重载次数:
void Foo(int x, int y, time_ref t)
基本原理:如果Foo
有另一个带有重载的参数,原型会成倍增加,例如对于t的X * 2过载,3个过载是6个原型,而使用上述转换器的过载为3个(如果使用了两个转换器,则为1个)。
他们总是:
Thye的不同之处在于:
问题:
1。是否有这种模式的接受/通用名称?我通常将它们称为“参数转换器”或“参数适配器”,这似乎并不常见
2。任何使它们正式化的建议 - 例如有没有办法(除了添加评论说这样),以确保它们仅用作参数?还有其他事情需要注意吗?
答案 0 :(得分:1)
您可能已经意识到,在C ++中,“接受/通用”取决于您正在运行的平台。例如,Unix C ++程序遵循WIN32 C ++程序的约定。也就是说,我没有经常看到这类课程,原因显而易见:它们会产生性能开销。您在每次调用函数时都在创建一个新对象,这是不必要的。但它确实为您节省了一些代码,因此在特定情况下它可能是值得的,但仍应仔细考虑。
据我所知,C ++中没有办法限制类仅用作参数。至少在没有在其构造函数中接收支持的类型之一的情况下,它们无法实例化。我正在考虑的一件事是你应该支持一个拷贝ctor来允许在调用之间传递转换器类(如果你有两个独立的函数集,如你所描述的,一个调用另一个)。
答案 1 :(得分:1)
当您需要处理许多不同的参数类型时,垫片通常是一个不错的选择,即使在您的界面“完成”之后也是如此。它允许您以模块化,相当可重用的方式进行转换。有关详细信息,请参阅this wikipedia entry及其参考文章。
答案 2 :(得分:0)
重载有什么问题?定义使用Foo(Bar(X))实现的Foo(X)是完全安全的。我认为制作包装类更清楚。