参数数据类型未知的可变参数函数
Variadic Functions with Unknown Data Types for its Parameters
请允许我说,我知道这个问题不适合大多数约定(如果有的话(,但出于对编程语言的好奇和热爱(C++(,无论如何我都会问这个问题。 请随时在下面用您的答案或评论纠正我。
问题:
"我们能否在接受多种(可能以前未知的(数据类型的参数的C++中制作可变参数函数,以及如何实现它?">
例:
JavaScript 示例
function buildArgs(... args) {
let iterator = 0,
length = args.length;
for (iterator; iterator != length; iterator += 1) {
let arg = args[iterator];
build(arg)
}
}
buildArgs(1); // Valid
buildArgs(1, "Hello"); // Valid
buildArgs(1, "Hello", null) // Valid
(假设(C++样本:
template <class... Args, typename data>
inline void buildArgs(Args... args) {
int iterator = 0,
length = sizeof args;
for (iterator; iterator != length; iterator += 1) {
data arg = args[iterator];
build(arg);
}
}
buildArgs(1); // Valid
buildArgs(1, "Hello"); // Valid
buildArgs(1, "Hello", NULL); // Valid
从给出的例子来看,被认为对函数buildArgs
有效的参数可以是任何数据类型(char
、int
、std::string
等(,而函数buildArgs
可以接受任意数量的这些有效参数。
我已经在C++中对可变参数函数和模板进行了一些小的研究,但我所看到的一切都没有回答这个问题。
同样,我不能说这个功能的实用性,但我非常想看看它是否可能。
链接:
• C 中具有不同类型参数的可变参数函数:C 中具有不同类型参数的可变参数函数
• 接受所有类型作为函数中的参数:接受所有类型作为函数中的参数
•C 语言编程:https://en.wikibooks.org/wiki/C_Programming/stdarg.h
•C++参考 - 参数包:https://en.cppreference.com/w/cpp/language/parameter_pack
•C++ 参考 - 折叠表达式:https://en.cppreference.com/w/cpp/language/fold
• C 中的参数数量可变:C++ 中的参数数量可变?
结论:
感谢您抽出宝贵时间阅读我的问题,更感谢您的回答。
参数包是当前的C++方法:
template<typename... Args> auto f(Args &&...args);
使用包,您可以做很多事情,但仍然可以做一些事情:
I. 将它们存储在元组或(如果可能(数组或initialization_list
中:
auto t = std::tuple(std::forward<Args>(args)...);
CommonType a[] = {args...};
std::set<int> mySet{args...};
II. 将它们用作函数参数(参见上面的元组构造。C++ 中的一个包感知运算符sizeof...
:
std::size_t currentArity = sizeof...(Args);
三、折叠包装:
bool any = (args || ...);
(std::cout << ... << args);
set::set<int> myOtherSet;
(myOtherSet.insert(args), ...);
等等。
在 C++11 的情况下,它要复杂得多: 活生生的例子。
template <typename T>
void printArgs(T &&x)
{
std::cout << std::forward<T>(x) << " - ";
}
template <typename FirstT, typename ...Args>
void printArgs(FirstT &&first, Args&&...remaining)
{
printArgs(std::forward<FirstT>(first));
printArgs(std::forward<Args>(remaining)...);
}
如您所见,您没有参数迭代器。而是使用伪递归。
还应该考虑一些奇怪的称为完美转发的东西。
在这里,您可以看到提供调试信息的实时示例
问题是:
"我们能否在接受以下参数的C++中制作可变参数函数 多种(可能以前未知的(数据类型及其方式 实施?
答案是肯定的。C++中的模板在使用时会实例化。因此,默认情况下,它们适用于任何类型,直到遇到内部的一些问题,例如某些功能不适用于特定类型。
在上面的示例中,您可以定义自定义类型,printArgs
将失败,因为新类型没有operator<<(std::ostream &, const NewType &)
。要解决它,您必须简单地提供这样的运算符,printArgs
将开始为新类型工作。
还有其他方法,如CRTP(奇怪的重复模板模式(等。C++中的模板主题相当长且复杂。
我们可以在接受多种(可能以前未知的(数据类型的参数的C++中制作可变参数函数吗?
是的。标题<cstdarg>
中有库工具,以简化此操作。
va_start
(允许访问可变参数函数参数(, -va_arg
(访问下一个可变参数函数参数(, -va_copy
(在
C++11 中引入,它复制了可变参数函数参数,-va_end
(结束可变参数函数参数的遍历(和
-va_list
(保存va_start
所需的信息,va_arg
,va_end
和va_copy
(。
此外,C,Go,C#,PHP,Java,JavaScript,Python,Perl 6支持此功能。
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 如何使用可变参数模板强制转换每个变体类型
- 关于如何在具有单个参数的变体构造中选择替代方案?
- 调用参数排列不变函数 f(i++, i++)
- 参数归纳与标准::变体
- 模板化回调参数的逆变,如 C# 中的逆变
- 如何在没有参数包的情况下编写变差函数
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 获取模板参数的成员变量值列表
- 保留短 lambda 用作函数的中间参数,使用 clang 格式保持不变
- 如何定义变体<x,y,z>提取模板参数的子类型
- 正确对齐内存模板,参数顺序不变
- 递归中不同参数类型的变元模板函数
- 通过函数指针传递给变差函数的参数会更改其值
- 提升预定义为带有参数的全局 lambda 的变体访问者
- 使用可变参数模板参数提升变体访问者
- boost ::变体 - 为什么模板参数比const字符串参数具有更高的优先级
- 将变参数包中的值加载到临时数组中
- 使用额外参数提升变体访客
- 正在将动态数组元素解析为参数?(变音符)