如何编写一个接受可变数量参数的函数?这可能吗,怎么做?
原文由 nunos 发布,翻译遵循 CC BY-SA 4.0 许可协议
console.log(1,"23")
#pragma once
#include <iostream>
#include <string>
const std::string RED = "\e[0;91m";
const std::string BLUE = "\e[0;96m";
const std::string YELLOW = "\e[0;93m";
class Logger {
private:
enum class Severity { INFO, WARN, ERROR };
static void print_colored(const char *log, Severity severity) {
const char *color_code = nullptr;
switch (severity) {
case Severity::INFO:
color_code = BLUE.c_str();
break;
case Severity::WARN:
color_code = YELLOW.c_str();
break;
case Severity::ERROR:
color_code = RED.c_str();
break;
}
std::cout << "\033" << color_code << log << "\033[0m -- ";
}
template <class Args> static void print_args(Args args) {
std::cout << args << " ";
}
public:
template <class... Args> static void info(Args &&...args) {
print_colored("[INFO] ", Severity::INFO);
int dummy[] = {0, ((void)print_args(std::forward<Args>(args)), 0)...};
std::cout << std::endl;
}
template <class... Args> static void warn(Args &&...args) {
print_colored("[WARN] ", Severity::WARN);
int dummy[] = {0, ((void)print_args(std::forward<Args>(args)), 0)...};
std::cout << std::endl;
}
template <class... Args> static void error(Args &&...args) {
print_colored("[ERROR]", Severity::ERROR);
int dummy[] = {0, ((void)print_args(std::forward<Args>(args)), 0)...};
std::cout << std::endl;
}
};
原文由 Orif MIlod 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答499 阅读✓ 已解决
您可能不应该这样做,而且您可能可以以更安全、更简单的方式做您想做的事情。从技术上讲,要在 C 中使用可变数量的参数,您需要包含 stdarg.h。从中您将获得
va_list
类型以及对其运行的三个函数,称为va_start()
,va_arg()
和va_end()
。如果你问我,这是一团糟。它看起来很糟糕,不安全,并且充满了与您在概念上试图实现的目标无关的技术细节。相反,请考虑使用重载或继承/多态性、构建器模式(如
operator<<()
在流中)或默认参数等。这些都更安全:编译器会更多地了解您正在尝试这样做在你把腿炸断之前,它可以阻止你的情况更多。