C++ 函数模板部分专门化的解决方法?
考虑以下积分pow的元函数(这只是一个示例):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
类元
{
模板静态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