传递给函数时转换参数 (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
了。使用 template
或 auto
不会改变 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")都将有效并使用相应的函数。
我刚开始自学 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
了。使用 template
或 auto
不会改变 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")都将有效并使用相应的函数。