我有一些带有 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++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>();
}