特定值的C ++模板特化

时间:2013-06-02 13:46:58

标签: c++ templates c++11 template-specialization partial-specialization

我的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,甚至会更好。

2 个答案:

答案 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
{
    // ....
};