【发布时间】:2013-08-24 23:29:10
【问题描述】:
这样做的最终目标是有一个函数可以接受可变数量的某种类型(相同类型,而不是不同类型)的参数,可以在函数调用中声明。
因为我使用的是 Visual Studio 2010,所以我不能这样做:
MyFunction({1,2,3});
在之前回答的问题中,我发现我可以使用boost::assign::list_of(),但是后来我发现如果你尝试只传递一个参数,这个seems to have a bug of some kind。
所以我做了更多的搜索,发现我可以使用可变参数函数来实现我的目标。
void TestFunction2<int>(int count, ...)
{}
但是,我想按类型限制它,所以最终发现我可以使用模板来做到这一点:
template <class T>
void TestFunction(const T& count, ...);
template <>
void TestFunction<int>(const int& count, ...);
不幸的是,像va_list 这样的可变参数显然不喜欢引用。我看到的限制此类类型的示例使用了 const 引用。如果我删除 count 参数的 const 引用方面,它可以按我的意愿工作,但我不知道这是否会导致可怕的副作用开始。
所以我想我的问题是,我在上面最后一个示例中所做的事情是好还是坏?如果不好,有什么好的替代方法,这样我就可以调用具有一个或多个内联参数的函数,例如 int 参数?
【问题讨论】:
-
我不能在 C++ Visual Studio 2010 使用的版本中使用初始化列表。
-
啊,那么唯一的选择就是骇人听闻的解决方案(例如包装类或 var_args)。我强烈建议不要使用这种方法……它们会使您的代码更加神秘,更难阅读/编辑/维护。只需声明一个临时数组或其
STL等价物。我知道,我知道这是一个额外的行,但它是更好的形式。 -
该函数会被调用很多次,每次调用时多出一行声明数组会很不方便。
-
MyFunc(3, new []{1,2,3});怎么样(请参阅我更新的答案)....应该适用于您的编译器(我假设)。
标签: c++ visual-studio-2010 c++11 variadic-functions