我的struct Opers
包含一些算术运算:mult()
,div()
,mod()
。
我需要为n
的某些值专门化模板。以下是Opers<1>
的示例。
但是,我也希望对{2}的幂n
进行专门化(n = 2,4,8,16,...) - 在这种情况下,我可以优化操作mult()
和div()
(使用向左或向右按位移位)。
#include <iostream>
using namespace std;
template<int n> struct Opers {
int mult(int x){
return n*x;
}
int div(int x){
return x / n;
}
int mod(int x){
return x % n;
}
};
template<> struct Opers<1> {
int mult(int x){
return 1;
}
int div(int x){
return x;
}
int mod(int x){
return 0;
}
};
int main() {
Opers<1> el2;
cout << el2.mult(3) <<endl;
}
我正在寻找像
这样的建筑template<> struct Opers<isPowerOfTwo()>
int mult(int x){
// do smth
}
是否可以或我应该阅读哪些手册?
UPD。允许使用C ++ 11,甚至会更好。
答案 0 :(得分:5)
在C ++ 11中,你可以这样做。首先,更改主模板,使其接受第二个虚拟参数:
template<int n, typename = void>
struct Opers
{
// ...
};
然后,编写一个constexpr
函数,确定整数是否为2的幂:
constexpr bool is_power_of_two(int x)
{
return (x == 1) || ((x % 2 == 0) && is_power_of_two(x / 2));
}
最后,使用SFINAE根据constexpr
函数的结果启用或禁用特化:
#include <type_traits>
template<int n>
struct Opers<n, typename std::enable_if<is_power_of_two(n)>::type>
{
// ...
};
答案 1 :(得分:2)
template <int N, typename = void>
struct Operations
{
// ....
};
template <int N, typename = std::enable_if<(N & (N - 1))>::type>
struct Operations
{
// ....
};