偶尔我发现我需要一个通用的“直通”接口(interface)。例如,对于将构造函数参数转发给父级的混合类。或者对于将参数转发给 new
的工厂方法:
template<typename C>
C * Create();
template<typename C, typename Arg0>
C * Create(Arg0 & a);
template<typename C, typename Arg0, typename Arg1>
C * Create(Arg0 & a, Arg1 & arg1);
template<typename C, typename Arg0, typename Arg1, typename Arg2>
C * Create(Arg0 & a, Arg1 & arg1, Arg2 & arg2);
当把这个想法付诸实践时,我发现它通常是有效的。
但是,有几个问题:
当按值传递模板参数时,有时引用类型会在此过程中降低其引用性。
我尝试的修复方法是将所有参数作为非常量引用传递。这适用于大多数情况,因为常量性保留在类型本身中,并且允许按值传递的参数转换为引用。
但是,一个值得注意的异常(exception)是临时 const 引用。有关更多信息,请参阅下面我的编辑。
然而,这一切只是我个人的经历。我在其他代码库中还没有看到这种方法。因此,我有兴趣了解您对上述问题的想法和见解。
我的主要问题是:
设计此类界面的一般准则和最佳实践是什么?
如何避免丢失类型信息? (完全可以避免吗?)
您能推荐此类设计的任何好的示例吗?
更新
回应@Ben Voigt 的评论。看来他明白了什么。它适用于绑定(bind)到左值的 const char *
字符串,但在传递 typeinfo 的 name() 方法的结果时它不起作用:
template<typename Arg0>
void Create(Arg0 & a) {}
void foo()
{
// works fine
const char * typeName = typeid(int).name();
Create(typeName);
// error: invalid initialization of non-const reference of type
// ‘const char*&’ from a temporary of type ‘const char*’
Create(typeid(int).name());
}
最佳答案
不是在 C++03 中,伙计。您必须显式重载 const 引用和非 const 引用的每个组合,这是指数级的。在 C++0x 中,完美的转发和可变参数模板将解决这个问题。
关于c++ - 如何设计可以处理不同数量的参数或具有任意参数类型组合的函数接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6317058/