如何将constexpr作为函数参数传递c ++ [重复]

Posted

技术标签:

【中文标题】如何将constexpr作为函数参数传递c ++ [重复]【英文标题】:How to pass a constexpr as a function parameter c++ [duplicate] 【发布时间】:2022-01-16 05:35:51 【问题描述】:

我有一个简单的函数,它用双精度值填充数组并返回数组:

double create_step_vectors(int n_steps, double step_size)

    std::array<double, n_steps + 1> vec;
    for (int i = 0; i <= n_steps; i++)
    
        arr[i] = i * step_size;
    
    return arr

我传入 n_steps ,它在主范围中定义为:

    constexpr int n_step static_cast<int>(1 / x_step) ;

我得到错误:

    error: 'n_steps' is not a constant expression
   13 |     std::array<double, n_steps + 1> vec;

我尝试将 n_steps + 1 放在大括号中,但没有帮助。发生错误的n_steps的目的是设置数组的大小arr。

我该如何解决这个问题?

【问题讨论】:

问题是参数变量本身不是编译时常量变量。使用数组而不是 std::vector 对您有什么要求?特别是考虑到不匹配的返回类型? 【参考方案1】:

你不能在需要编译表达式的地方使用函数参数,因为参数不是constexpr,即使在constexpr函数中(你的constexpr函数也可以用非constexpr值调用) .

在您的情况下,最简单的解决方案可能是使用非类型模板参数:

template <int n_steps>
auto create_step_vectors(double step_size)

    std::array<double, n_steps + 1> arr;
    for (int i = 0; i <= n_steps; i++)
    
        arr[i] = i * step_size;
    
    return arr;

然后

constexpr int n_step static_cast<int>(1 / x_step) ;
const auto arr = create_step_vectors<n_step>(1.);

【讨论】:

以上是关于如何将constexpr作为函数参数传递c ++ [重复]的主要内容,如果未能解决你的问题,请参考以下文章

c++ - 如何将void函数作为参数传递?

我可以将 C++17 无捕获 lambda constexpr 转换运算符的结果用作函数指针模板非类型参数吗?

C语言中如何将二维字符数组作为函数参数引用传递

如何将 COM 方法作为函数参数传递?和 Microsoft 编译器错误 C3867

C ++:将未知的union传递给函数作为参数

如何将向量的一部分作为函数参数传递?