变量参数
Variable arguments
有没有一种非升压的方式来创建带有变量参数的函数?我知道
我需要知道是否有办法不提供参数计数或以 null 结束参数列表。
我知道参数类型,它们通常小于 5。
如果它不会大于 5
,那么简单的重载可能会完成工作。调用重载,它接受来自接受少于 5 个参数的所有其他重载的最大参数数,或者定义一个工作线程(内部)函数,从重载调用它。
可能,您可以对某些参数使用默认值,如果这有助于减少重载函数的数量。
在 C++11 中,您可以使用可变模板。
对于最多 5 个相同类型的参数,简单的重载就可以解决问题。
为了更通用,支持任意数量的相同类型的参数,只需传递一个集合,例如 std::vector
.
有关在每次调用中动态构建此类集合的 C++03 技术,请参阅我的另一个答案;对于 C++11,如果不需要支持 Visual C++则可以使用大括号初始值设定项列表作为实际参数。
cstdarg 是你要找的吗?这是生成具有可变参数数量的函数的标准C++方法。
您应该能够使用 va_list 实现传递变量参数。
您可以:
- 如果您使用的是 C++11,则可以使用可变参数模板,否则...
- 提供重载
- 使用默认为某些可以识别的 ALA
f(const T& v1 = missing, const T& v2 = missing, ...) { if (v5 != missing) ...
的哨兵值的参数 - 创建一个简单的帮助程序模板,可以选择从数据类型构造该模板,并具有一个布尔值来跟踪它是否
- 您可能需要通过使用new/delete(简单安全但缓慢)或将放置
new
的对齐缓冲区,手动销毁等来支持没有默认构造函数的类型(繁琐且容易出错但更快)
- 您可能需要通过使用new/delete(简单安全但缓慢)或将放置
- 某些编译器具有可变参数宏支持
- 如果您准备稍微更改调用语法,则可以使用任意数量的东西:
- 接受向量(如果类型不同,则使用联合或变体)
- 接受数组(可能使用
template <size_t N> void f(T (&data)[N]) { ... }
技巧让编译器自动提供数组大小) - 某种 LHS 对象,可以使用运算符(如
operator,
或operator<<
)为其提供额外的值
作为常规的 C++03 解决方案,您可以提供一个 setter,该 setter 返回对调用它的对象的引用,以便可以再次调用它。再说一遍。等等,称为链接。
这与iostreams用于operator<<
的方案相同。
例如
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
void foo( char const s[] )
{
cout << s << endl;
}
class StringBuilder
{
private:
string s_;
template< class Type >
string fastStringFrom( Type const& v )
{
stringstream stream;
stream << v;
return stream.str();
}
char const* fastStringFrom( char const* s )
{
return s;
}
string const& fastStringFrom( string const& s )
{
return s;
}
public:
template< class Type >
StringBuilder& operator<<( Type const& v )
{
s_ += fastStringFrom( v );
return *this; // Supports chaining.
}
operator string const& () const { return s_; }
operator char const* () const { return s_.c_str(); }
};
int main()
{
typedef StringBuilder S;
foo( S() << "6*7 = " << 6*7 << "." ); // Any number of arguments.
}
您无需将参数值转换为文本,只需执行所需的任何操作即可。例如,使用一组固定的可能类型,可以将参数存储在集合中。
如果不需要支持 Visual C++ 编译器,则可以使用 C++11 可变参数模板。
相关文章:
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 扩展可变参数模板中的变量名称
- 在类构造函数中定义结构变量的参数
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- 存储稍后要转发的变量参数
- C++具有模板成员变量的类. 和参数内存输出
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- 为变量模板的每个参数调用模板函数
- 具有推导参数的模板函数指针数组变量
- 函数参数变量总是需要 & 或 * 运算符吗?
- 为什么 beginthreadex 线程参数变量在父线程中没有更新
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 如何在函数中使用非参数变量?
- 即将将引用作为函数中的参数传递以更改参数变量的值
- 基于不断变化的参数/变量的XML get值
- cocos2d-x v3 CallFunc作为参数/变量如何
- 在编译时使用c++元编程中的运行时参数(变量)
- 我可以返回一个非参数变量吗?