在编译时使用c++元编程中的运行时参数(变量)
Using a runtime parameter (variable) in C++ metaprogramming at compile-time
是否有机会使元编程函数而不是在编译中展开所有参数?只是想有一些参数作为运行时参数和一些编译器。因为我知道它们中的一些会在1的范围内。10但其他的是未知的(将在运行时知道)。
让我们使用标准的元编程示例:
unsigned int factorial(unsigned int n) {
return n == 0 ? 1 : n * factorial(n - 1);
}
template <int n>
struct factorial {
enum { value = n * factorial<n - 1>::value };
};
template <>
struct factorial<0> {
enum { value = 1 };
};
// Usage examples:
// factorial<0>::value would yield 1;
// factorial<4>::value would yield 24.
下面是我的例子:
unsigned int cutom_imagined_function(unsigned int n, unsigned int runtime_param /* this will be given at runtime */) {
return n == 0 ? 1 : (n + runtime_param) * cutom_imagined_function(n - 1);
}
我如何将上面的转换为元编程?然后像下面这样运行(或者类似的代码):
// int variable;
// variable = get_var_from_user();
// cutom_imagined_function<4>::value(variable)
你可以使用同样的方法:常量表达式成为模板参数,其他的都不是:
template <unsigned int N>
struct cutom_imagined
{
static unsigned int function(unsigned int r)
{
return (N + r) * cutom_imagined<N - 1>::function(r);
}
};
template <>
struct cutom_imagined<0>
{
static unsigned int function(unsigned int) { return 1; }
};
用法:
unsigned int result = cutom_imagined<N>::function(get_input());
假设你是认真的:
unsigned int cutom_imagined_function(
unsigned int n,
unsigned int runtime_param)
{
return n == 0 ? 1 : (n+runtime_param)*custom_imagined_function(n-1, runtime_param);
}
这是我认为你所描述的一般概念。其实很简单。让函数本身成为模板。
template<unsigned int in>
unsigned int custom_imagined_function(unsigned int runtime_param) {
return (n+runtime_param)*custom_imagined_function<n-1>(runtime_param);
}
template<>
unsigned int custom_imagined_function<0>(unsigned int runtime_param) {
return 1;
}
int main() {
int variable;
std::cin >> variable;
unsigned int result = custom_imagined_function<4>(variable);
}
或者,您可以使用稍微详细的std::integral_constant
。
unsigned int custom_imagined_function(
std::integral_constant<unsigned int,0>,
unsigned int runtime_param)
{
return 1;
}
template<unsigned int in>
unsigned int custom_imagined_function(
std::integral_constant<unsigned int,n>,
unsigned int runtime_param)
{
std::integral_constant<unsigned int,n-1> less;
return (n+runtime_param) * custom_imagined_function(less, runtime_param);
}
int main() {
std::integral_constant<unsigned int,4> four;
int variable;
std::cin >> variable;
unsigned int result = custom_imagined_function(four, variable);
}
另外,现在我们有了constexpr
(至少在某些编译器中),factorial
很容易简化:
constexpr unsigned int factorial(unsigned int n) {
return n==0?1:n*factorial(n-1);
}
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 是否可以在运行时强制转换模板参数?
- 在 C++ 中运行时调用模板时,是否可以切换模板的参数类型?
- 在运行时使用枚举器值作为模板函数的模板参数的元程序
- C++ 模板类:运行时给出的模板参数,如何避免重复大开关情况?
- 如何使用模板生成常规参数列表并将其传递给运行时函数?
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- C++具有移动语义的可变参数工厂会导致运行时崩溃
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 构造一个可变参数模板化类,其中参数在运行时已知
- 在解压缩可变参数模板时避免"recursive"函数调用,直到运行时条件
- 根据运行时参数避免模板实例化的代码重复
- 使用运行时参数与编译时参数在类之间共享代码
- 根据运行时参数调用模板函数的不同版本
- 带有运行时参数的桥接模板
- 不带操作员的对象的数组初始化,复制构造函数或默认构造函数和运行时参数
- 将运行时参数传递给odeint积分器
- 基于运行时参数执行整型模板函数
- 为所有类提供运行时参数的规范方法——global
- 在编译时使用c++元编程中的运行时参数(变量)