【问题标题】:Expecting various argument types in c++期待 C++ 中的各种参数类型
【发布时间】:2015-10-19 15:58:52
【问题描述】:

我正在 C++ 中创建一个等效于 JavaScript 的 console.log,但我不确定如何让我的函数期望不同类型的参数。

在 JavaScript 中:

function print(arg)
{
    if(typeof arg=="number") { ... }
    if(typeof arg=="string") { ... }       
}

当然,JavaScript 不关心你给一个函数什么,但 C++ 关心,所以我怎样才能让它捕获任何(或至少指定它接受的类型),以便稍后在函数本身中处理?

到目前为止我所拥有的一切:

void print(string input)
{
    cout << input << "\n";
}

【问题讨论】:

  • 您是否希望它能够接受不同类型的输入,例如 int 或 double 或 string?

标签: c++ function arguments


【解决方案1】:

您可以通过function template 完成此操作。

template <typename T>
void print(const T& output)
{
    std::cout << output << "\n";
}

这将为您传递给它的每种类型创建一个print 函数。

编辑:

如果您希望它也适用于数组,则可以从 cmets 中添加

template<typename T, std::size_t N>
void print(T (&output)[N])
{
    for (std::size_t i = 0; i < N; i++)
    {
        std::cout << output[i] << " ";
    }
    std::cout << "\n";
}

您可以在 Live Example

中看到所有这些一起工作

【讨论】:

  • 这正是我想要的!谢谢!这也适用于数组吗?我对数组很不熟悉,所以我什至不确定如何测试。
  • @jeremiahchandler 不,这不适用于数组。如需打印数组,请参阅:stackoverflow.com/questions/1370323/printing-an-array-in-c
  • 我的意思是,我知道打印输出不会打印数组,但是这个模板至少会接受一个数组供我在其中管理吗?
  • 是的,这个模板可以接受一个数组。您可以使用一个可以接收数组的函数来重载该函数。
  • @jeremiahchandler 更新了答案。
【解决方案2】:

这是一个已解决的问题。

std::cerr << "My console output with a number! " << 42 << std::endl;

这将转到 stderr,一个输出流通常由您的 shell 处理,与 stdout 不同,以帮助调试和查找故障。它是 JavaScript 的 console.log 的完美模拟,并且已经存在。

【讨论】:

    【解决方案3】:

    您可以使用 NathanOliver 描述的函数模板。

    您还可以使用函数重载:只需定义多个具有相同名称但参数类型不同的函数。编译器会选择正确的。取决于你在做什么,函数重载可能比模板函数更好。特别是,如果每种类型的参数都需要不同的函数体来处理它,那么函数重载可能比模板更有意义。

    【讨论】:

    • is Nathan 的解决方案......您的所有变体都是要求 OP 手动写出每个重载。
    • 我试图为我的答案添加更多理由。模板是一种生成多个共享同一个主体的函数的方法。函数重载是一种编写具有不同主体的函数的方法,这些函数可以类似地调用。根据您正在做的事情,您可能希望拥有不同的主体,因此函数重载更有意义。我不确定模板专业化是否适用于函数模板;因此,如果您想在不使用重载的情况下拥有不同的函数体,那可能会很困难。
    • 函数模板在实例化时会产生函数重载。这些重载绝对不会“共享同一个主体”——无论您使用的是从属名称,它们都会有所不同。从某种意义上说,您正在尝试比较苹果和苹果。唯一不同的是,内森的苹果是从蔬菜水果店买来的,而你自己在花园里种植每个品种。
    • 好的,有道理。我对“身体”的定义与您略有不同,我正在考虑程序员在源文件中编写的字符。有时您希望函数重载的主体非常不同,因此您应该在自己的花园中种植它们。就像,如果传入一个整数,那么你想以某种特殊的方式对其进行格式化。而如果传入的是字符串,那么你要打印“Here is a string”什么的。
    • 实际上,重载是我非常需要的,我需要根据参数不同的实际代码,所以这就是我需要的:-)
    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多