通过 C++ 编译时已知的参数值对函数进行特殊化

问题描述 投票:0回答:1

我有一些带有 2 个参数的函数:距离和半径

float expensive_function(float distance, float radius) {
    return distance + radius;
}

整个项目仅使用 2 个不同的半径,并且它们在编译时都是已知的(

1.2f
3.4f
)。有没有办法知道这一点来专门化这个函数?我想要类似的东西,但它无法编译:

template <float RADIUS>
float expensive_function(float distance) {
    return distance + RADIUS;
}

expensive_function<1.2f>(run_time_distance);
expensive_function<3.4f>(run_time_distance);

编译器说:

Candidate template ignored: invalid explicitly-specified argument for template parameter 'RADIUS'
No matching function for call to 'expensive_function'

我对C++模板编程不是很熟悉,所以没想到它能起作用。我不知道我正在寻找的东西是否可能。我只是想确保编译器将为这两种情况生成性能最佳的代码,而且在我看来,它在语义上更好。

c++ templates optimization specialization partial-specialization
1个回答
0
投票

在 C++20 之前,您无法创建

float
double
非类型模板参数。

您需要使用

int
和一些表格来查找以使其编译

#include <iostream>

static constexpr float floats[] = {10,20};
template <int index>
void foo()
{
    constexpr float value = floats[index];
    std::cout << value << '\n';
}

int main()
{
    foo<0>();
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.