编辑:我可以简化以下模板吗?
感谢您的优秀答案。我显然没有给出我的问题足够的细节。我试图纠正这一点,
我更新一些旧代码,并有几个重载函数具有以下模式:
void foo (Int bla, const char* bla1, const char* bla2, ...);
void foo (Int bla, SomeCustomContainer);
现在,我们正在逐步淘汰的自定义容器,并使用std容器代替。自定义容器的签名是这样的,我可以在continainer上进行模板化,重新使用代码,并同时支持旧代码和新代码,直到遗留代码被淘汰。
我的第一个尝试是:
template <typename ContainerT> void foo(int bla, ContainerT);
但是编译器吐出了一个错误,原因是其在为const char *签名的模板函数相匹配。
基于StackOverflow上一个答案,我想下面的模板签名:
template <typename ValT, template <typename, typename = std::allocator<ValT> >
class ContainerT>
void foo(Int bla, const ContainerT<ValT>& rasInParams)
这解决我的问题 - 编译器找到正确的过载,一切工作正常,我的目的。我唯一的抱怨是,对于一个对模板不太熟悉的同事来说,这是一个很大的分析,我想知道是否有一种方法可以简化它 - 我正在考虑使用类型别名,但也许有人知道更好的方法来解决我的基础重载解决问题?
什么叫 “更容易阅读” 期待? – davidhigh
我认为这两个答案仍然有效的更新的问题。你所要做的就是向'SomeCustomContainer'类中添加'value_type'类型定义(如果它们不存在的话)(或者你也可以在@ sehe的答案中使用'begin()'开始使用这个技巧) –
@Anton Savin:对不起,我没有得到你想说的话 - 如果是我当前的解决方案和通过各种定制容器并修改它们(当目标只是将其删除时)之间的选择,我更喜欢当前的解决方案。我的问题不是我需要知道值类型,而是编译器发现错误的函数重载(不是模板实现,而是接受char *)。 – Spacemoose