【问题标题】:Template, branching on length for array from compile-time initializer list模板,从编译时初始化列表中的数组长度分支
【发布时间】:2017-06-24 03:55:50
【问题描述】:

基本上我尝试做的是

#include <array>
#include <initializer_list>

template <class... Fs>
auto F(const std::initializer_list<double>& vars, const Fs&... exprs) {
    return std::array<double, vars.size()>{};
}

这当然不会编译,因为 vars 的长度不是编译器所知道的编译时常量。问题是,我确实可以在编译时知道它的长度,尽管这些值是未知的。问题是,如果我将初始化列表扩展为可变参数模板,则会产生两个可变参数包。

我是否必须将显式数字参数传递给函数?如何实现或接近所需的语义?

编辑:我不必返回数组,我只需要返回一个双精度序列,最好在堆栈上。

【问题讨论】:

  • 我个人认为这是constexpr函数的缺陷。您可以尝试使用元组进行转发,但会使语法更丑
  • std::array 几乎是您从堆栈上返回一系列对象所能获得的最接近的结果。这和std::tuple

标签: c++ templates


【解决方案1】:

如果你在编译时就知道大小,为什么不使用长度固定的数组作为模板参数呢?

#include <array>

template < size_t N, class... Fs >
auto F(const double (&vars)[N], const Fs&... exprs) {
  return std::array<double, N>{};
}

int main()
{
  auto a = F({ 1, 2, 3, 4 });
}

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2018-02-06
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多