Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数模板部分专门化的解决方法?_C++_Templates_C++11_Metaprogramming_Partial Specialization - Fatal编程技术网

C++ 函数模板部分专门化的解决方法?

C++ 函数模板部分专门化的解决方法?,c++,templates,c++11,metaprogramming,partial-specialization,C++,Templates,C++11,Metaprogramming,Partial Specialization,考虑以下积分pow的元函数(这只是一个示例): 类元 { 模板静态constexpr T ipow(T x) { 返回(N>0)?(x*ipow(x)) :((N0)?(x*ipow0)>(x)):(N

考虑以下积分pow的元函数(这只是一个示例):

类元
{
模板静态constexpr T ipow(T x)
{
返回(N>0)?(x*ipow(x))
:((N<0)?(静态铸造(1)/ipow(x))
: (1))
}
};

如何编写此类函数的停止条件?

只需在类模板中使用
静态成员,并专门化类模板。不过,为了方便起见,您可能需要创建一个转发函数模板。

每当您问自己“如何模拟函数的局部专门化”,您都可以考虑“重载,让局部排序决定哪个重载更专业”

模板
使用int_u=std::integral_常量;
类元
{
模板静态constexpr T ipow(T x)
{
返回ipow(x,int_uz());
}
模板静态constexpr tipow(tx,int)
{
//(-N)??
返回静态(1)/ipow(x,int_u();
}
模板静态constexpr tipow(tx,int)
{
返回x*ipow(x,int_());
}
模板静态constexpr tipow(tx,int)
{
返回1;
}
};

我认为您希望在注释标记的位置传递
-N
而不是
N

一个简单的版本可能是这样的:

template <typename T, unsigned int N> struct pow_class
{
    static constexpr T power(T n) { return n * pow_class<T, N - 1>::power(n); }
};

template <typename T> struct pow_class<T, 0>
{
    static constexpr T power(T) { return 1; }
};

template <unsigned int N, typename T> constexpr T static_power(T n)
{
    return pow_class<T, N>::power(n);
}
模板结构pow_类
{
静态constexpr T power(tn){return n*pow_class::power(n);}
};
模板结构pow_类
{
静态constexpr T幂(T){return 1;}
};
模板constexpr T静态功率(tn)
{
返回功率等级::功率(n);
}
用法:

auto p = static_power<5>(2);  // 32
auto p=static_power(2);//32

@n.m.请发布解决方案,你如何过载ipow函数模板,我的头已经被敲碎了:d我想你可以做
返回(n>0)?(x*ipow0)>(x)):(N<0)?(静态(1)/ipow0(x)):(1))。这真是太恶心了,所以我不推荐它。@Mr.Anubis:Johanneschaub litb打败了我,看看他的答案。@Johanneschaub litb:为什么原始版本会导致无限递归而不是你讨厌的攻击(它工作得很好,我测试过,但我不明白确切的原因)?@Vincent,因为我讨厌的黑客在假分支中使用
作为参数,而不是不断递减的数字。如果为0,则原始版本将为-1、-2、。。。没有结束。当前的(C++11)语言不会阻止这种递归,即使分支的条件是编译时常量(如您的情况)。为什么不简单地删除
ipow
?@Xeo-bah的显式模板参数呢?它会变得混乱,因为一些重载(用于-1的重载)仍然需要“N”所以它需要一个明确的论点。我想这样更有帮助。啊,我明白了。是的,因为你基本上是用
N
来计算方向和计数。
template <typename T, unsigned int N> struct pow_class
{
    static constexpr T power(T n) { return n * pow_class<T, N - 1>::power(n); }
};

template <typename T> struct pow_class<T, 0>
{
    static constexpr T power(T) { return 1; }
};

template <unsigned int N, typename T> constexpr T static_power(T n)
{
    return pow_class<T, N>::power(n);
}
auto p = static_power<5>(2);  // 32