传递给函数时转换参数 (c++)

Converting parameters when passing to functions (c++)

我刚开始自学 C++,在函数参数传递方面遇到了困难。例如,我正在使用我自己的打印函数,您只需将字符串放入参数并将其记录到控制台。

//Print Function
void print(std::string message = "") {
    std::cout << message << std::endl;
}

但是,因为我将其声明为 std::string 变量,所以如果我向它传递一个数字,它就不会打印出来。最终我想制作一个像 Python 中那样的输入和打印系统。我该怎么做?有没有办法将参数转换为字符串?或者其他一些解决方案。另一个有类似问题的函数是我的输入函数:

//Input function (Enter does not work without text, space is not text)
std::string input(const char* message = "") {
    std::cout << message;
    std::string x;
    std::cin >> x;
    return x;
}

这不允许 return 是一个 int 使得使用输入的计算更加困难。感谢任何帮助提前致谢!

~摩西

Can++ 模板在那里很有用。

//Print Function
template <typename T>
void print(const T& message) {
  std::cout << message << std::endl;
}

void print() {
  std::cout << std::endl;
}

注意,我删除了默认参数值并使用了重载函数。使用传递的空参数类型的模板参数无法推导。 print 不适用于容器,您需要更多努力来打印容器,在 Python 中它可以从盒子中使用。

//Input function (Enter does not work without text, space is not text)
template <typename T>
T input(const char* message = "") 
{
  std::cout << message;
  T x;
  std::cin >> x;
  return x;
}

用法:int n = input<int>("Input number:");.

除了template,如果你的编译器支持C++14,你也可以使用auto和lambda函数。您可以将所有这些都写在主函数中。

auto print = [](const auto& message) {std::cout << message << std::endl;};
print(1); //1
print("AAA"); //AAA

请注意,与 Python 不同,当您想要打印某些内容时,您不需要先将其转换为 string。只要你要打印的东西超载了cout,你就可以直接cout了。使用 templateauto 不会改变 C++ 中所有内容都是静态类型的事实,只是编译器会自动为您创建不同版本的重载函数。

编辑 正如@Peter 在评论部分指出的那样,说“cout 是可以重载的东西是完全错误的”,更准确地说是为 ostream 重载 operator<< 和对应的class

或者我发现了一种不使用 lambda 的方法:

void print(int message) {
    std::cout << message << std::endl;
};

void print(float message) {
    std::cout << message << std::endl;
};

void print(std::string message) {
    std::cout << message << std::endl;
};

通过创建多个具有相同名称的函数,它将使用一个有效的函数,因此任何输入(3.14、8、"Hello")都将有效并使用相应的函数。