我正在努力为以下问题找到一个好的解决方案:
我想实现一个函数,它接受可变数量的容器参数并返回最大容器的大小.这是一个例子:
std::vector vStr(2, "foo");
std::vector vInt(1, 123);
std::vector vDouble(3, 1.1);
std::list lChar(4, '*');
// or even more container
size_t uiMaxSize = getMaxContainerSize(vStr, vInt, vDouble, lChar /*, ...*/);
在这种情况下getMaxContainerSize
应返回4,因为lChar
最大尺寸为4.
我已经使用以下方法实现了此解决方法cstdarg
:
#include
...
size_t getMaxContainerSize(int iCnt, ... )
{
size_t uiMaxSize = 0;
va_list ap;
va_start(ap, iCnt);
for(int i=0; i
但有了这个,我必须.size()
为每个容器键入,我还必须指定容器的数量.我也不喜欢在C++程序中使用C语言,我问自己是否有更好的方法来实现它.也许通过使用一些类和重载,operator<<()
所以我可以键入这样的东西:
MaxSizeFinder cFinder;
cFinder << vStr << vInt << vDouble << lChar;
size_t uiMaxSize = cFinder.getResult();
你觉得这样的事情有可能吗?有什么建议?
谢谢.
1> chris..:
使用可变参数模板:
template
std::ptrdiff_t getMaxContainerSize(const Conts&... conts) {
return std::max({conts.size()...});
}
当您将容器作为参数传递时,编译器将推导出类型列表Conts
.函数的每个参数都是const &
*.使用conts.size()...
expands conts1.size(), conts2.size(), ..., contsN.size()
,conts#
给函数赋予每个参数.事实证明它std::max
有一个方便的重载,你可以委托给它.
与C变量函数相比,可变参数模板有几个关键优势:
它们是类型安全的 - 编译器保证在类型不匹配时抱怨,并且您不需要格式字符串或任何东西.
该函数知道传递了多少个参数,你可以使用它sizeof...(Conts)
.
进入时,参数没有什么特别的事情发生.在一个可变函数中,当函数必须将它取出时,char
它将是一个特殊int
的函数.
使用参数时,不需要显式指定任何类型.这意味着您可以接受无限多种类型而不是预定义列表(想想printf
的格式说明符).
最后,根据注释,返回类型被更改为签名类型,该类型主要作为签名对应方size_t
(类似于非标准类型ssize_t
).
为了面向未来的答案,很快就会std::size
有更通用的方法来获得容器的大小:
using std::size;
return std::max({size(conts)...});
这扩展类似于上面: size(conts1), size(conts2), ..., size(contsN)
*通常,参数包与T&&...
with 一起使用std::forward
而不是const T&...
.size
当使用的对象是rvalue时,这可能会为您带来第三方类的东西,这些类具有更高效的功能.然而,它增加了复杂性,因为任何好处的机会都很低.