在编译时使用c++元编程中的运行时参数(变量)

Using a runtime parameter (variable) in C++ metaprogramming at compile-time

本文关键字:运行时 参数 变量 编程 编译 c++      更新时间:2023-10-16

是否有机会使元编程函数而不是在编译中展开所有参数?只是想有一些参数作为运行时参数和一些编译器。因为我知道它们中的一些会在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);
}