【问题标题】:What would be equal of Java function with any number of parameters in C++? [duplicate]在 C++ 中具有任意数量参数的 Java 函数等于什么? [复制]
【发布时间】:2018-03-13 13:44:24
【问题描述】:

在 C++ 中具有任意数量参数的 Java 函数等于什么?

void anyNumberOfParamas(String... strings) {
    for (String str : strings) {
        // do something with string
    }
}

【问题讨论】:

标签: c++


【解决方案1】:

您有两个选择:可变参数模板或采用std::initializer_list的函数。


第一个看起来像这样:

template <typename... Ts>
void anyNumberOfParams(const Ts&... xs)
{
    (something(xs), ...);
}

使用这种方法,每次使用不同类型调用它时,您都会获得不同的 anyNumberOfParams 实例化。 “迭代”在编译时完成。

如果你想让这个函数只接受std::string,你还需要适当地约束Ts...


第二个是这样的:

void anyNumberOfParams(std::initializer_list<std::string> xs)
{
    for(const auto& x : xs) something(x);
}

std::initializer_list 基本上是const 元素数组的语法糖。在这种情况下,迭代是在运行时完成的,并且只有一个 anyNumberOfParams 的实例化。

不幸的是,std::initializer_list 有一些你应该注意的怪癖(例如,不能从中移动元素)。

【讨论】:

  • 通过 const 引用获取 std::initializer_list 是否有好处? (真正的问题)。
  • 不要忘记va_args 的东西。老式的是,但经过试验和测试。不再提及他们就像不被允许谈论你的前女友。
  • @StoryTeller:为什么不问问社区?
  • @Bathsheba - 这是 B 计划。
  • @StoryTeller initializer_list 可能不应该被 const 引用使用,因为它总是由值创建的。基本上是struct { T const* data; std::size_t size; };。如果您查看任何采用 initializer_list 的标准库函数或构造函数,它们都是按值进行的
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多