生成代码实例化具有不同参数的函数模板
Generate code instantiating a function template with different arguments
给定以下代码:
#include <iostream>
template <int X, int Y>
int foo(int v) // dummy parameter
{
return v * X + v / Y; // dummy calculation
}
int main()
{
// x, y, v are only known at runtime
int x = 4;
int y = 6;
int v = 3;
int result = 0;
if (x == 1 && y == 1) result = foo<1, 1>(v);
if (x == 1 && y == 3) result = foo<1, 3>(v);
if (x == 5 && y == 1) result = foo<5, 1>(v);
if (x == 4 && y == 6) result = foo<4, 6>(v);
if (x == 8 && y == 4) result = foo<8, 4>(v);
// ...
std::cout << result << std::endl;
}
我想对X
和Y
的不同组合实例化foo
,如main
中所示。
if
级联然而,这可能会变得很丑陋(很长)。使用C 14(例如,使用预处理程序)生成此代码的可能性是否有可能?
这是一个使用递归的版本。
#include <iostream>
#include <utility>
#include <stdexcept>
template <int X, int Y>
int foo(int v) // dummy parameter
{
return v * X + v / Y; // dummy calculation
}
template <std::size_t index = 0>
int foo(int x, int y, int v) {
constexpr std::pair<int, int> numbers[] = {{1, 1}, {1, 3}, {5, 1}, {4, 6}, {8, 4}};
if constexpr (index < sizeof numbers / sizeof *numbers) {
if (numbers[index].first == x && numbers[index].second == y) {
return foo<numbers[index].first, numbers[index].second>(v);
}
return foo<index + 1>(x, y, v);
} else { //no match
throw std::runtime_error("No matching pair found");
}
}
int main() {
// x, y, v are only known at runtime
int x = 4;
int y = 6;
int v = 3;
int result = foo(x, y, v);
std::cout << result << std::endl;
}
如果您没有C 17,则可以用标签调度替换if constexpr
。Clang和GCC都设法优化了以-O1的开始。
生成已知对和y对的代码和实例,如果这只是您想要的。
#define XYLIST
X(1,1)
X(1,3)
X(5,1)
X(4,6)
X(8,4)
// etc.
#define X(X1, Y1)
if (X1 == 1 && Y1 == 1) result = foo<X1, Y1>(v); else
XYLIST
{ throw "failed"; }
#undef X
添加了一个" else",因为不应该有两行相同。最后一个"投掷"结束了其他cascade。
您可以将它们转换为常数表达式。如果在手动之前已知incase值
#include <iostream>
template <int X, int Y>
int foo(int v) // dummy parameter
{
return v * X + v / Y; // dummy calculation
}
int main()
{
// x, y, v are only known at runtime
const int x = 4;
const int y = 6;
int v = 3;
int result = 0;
result = foo<x, y>(v);
std::cout << result << std::endl;
}
但是,模板不是要执行的算法,而是要扩展的宏来生成代码。我不建议将模板用于相同的数据类型,在这种情况下,您只使用INT。因此,根据编码标准不是特别需要的模板。
在函数本身中传递这些值。
方法1:如果您只有整数。
int foo(int v, int X, int Y) // dummy parameter
{
return v * X + v / Y; // dummy calculation
}
int main()
{
// x, y, v are only known at runtime
int x = 4;
int y = 6;
int v = 3;
int result = 0;
result = foo(v,x,y);
}
方法2:如果可以传递任何东西,即double data-type 等。
template <typename T>
T foo(int v, T Y, T Y) // dummy parameter
{
return v * X + v / Y; // dummy calculation
}
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 具有常量引用参数的函数模板专用化
- 使用可变参数函数作为模板参数
- std::span<const T> 作为函数模板中的参数
- 如何在C++中伪造虚拟可变参数函数模板?
- C++ std::functional 中的可变参数函数模板
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 三个参数函数模板令人困惑的示例
- 父可变参数函数模板专门用于子级
- C++如何将可变参数函数模板的参数包 -> 包装到 lambda 中
- 将函数传递给可变参数函数模板
- 为什么可变参数函数模板中的这个 constexpr 不是常数?
- 将多个初始值设定项列表传递到可变参数函数模板时遇到问题
- 依赖类型不明确的 c++11 可变参数函数模板重载是否不明确
- 操作可变参数函数模板的函数参数
- C++11 中的非类型可变参数函数模板
- 将可变参数函数模板的每个参数传递给返回void的函数
- 包扩展不在最后一个参数中的可变参数函数模板
- 将可变参数函数模板参数存储到联合向量中的最有效方法
- Clang 和 GCC 在解决可变参数函数模板重载时的行为不同