【问题标题】:Converting parameters when passing to functions (c++)传递给函数时转换参数(c ++)
【发布时间】:2018-04-28 01:47:49
【问题描述】:

我刚刚开始自学 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;
}

这不允许返回为 int 女巫使使用输入的计算变得更加困难。提前感谢任何帮助!

~摩西

【问题讨论】:

  • 使用模板可能是你想要的
  • 在哪里可以找到更多帮助?我不知道模板是什么。
  • @Mose 我建议你在掌握 C++ 之前不要使用模板。
  • 如果您要处理有限的参数类型,则可以选择函数重载。
  • 例如使用std::to_string(4) 调用你的函数

标签: c++ variables parameter-passing variable-types


【解决方案1】:

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

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&lt;&lt;

【讨论】:

  • 超载是什么意思?所以 auto 被用来代替“void, int, const char, std::string” 和那些标识符。你能解释一下你为什么要在这里做你正在做的事情吗? auto print = [](const auto&amp; message) 谢谢,这似乎是一个方便的工具!
  • 函数重载是指同名但参数类型/数量不同的函数。在这种情况下,编译器会为您生成 print(int) 和 print(char*)。如果您不使用模板/自动,则需要自己编写这两个函数。
  • auto print = [](const auto&amp; message) 这是一种新的 C++ 语法,称为 lambda 表达式。与全局函数基本相同,但写起来很方便。
  • 非常感谢!我会去看一些关于 lambda 和 auto 的视频。很好的答案
  • cout 是一个对象。这不是可以超载的东西。它是一种类型 (std::ostream),为其提供了一组重载函数,包括 operator&lt;&lt;()。但是说cout 是可以重载的东西是完全错误的。
【解决方案2】:

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&lt;int&gt;("Input number:");

【讨论】:

  • 谢谢!生病看看模板:)
【解决方案3】:

另外,我发现了一种不使用 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”)都将起作用并使用相应的函数。

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2013-01-27
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多