6

私はOpersいくつかの算術演算を含む構造体を持っています: mult(), div(), mod().

そして、 の特定の値に対してテンプレートを特殊化する必要がありますn。の例を次に示しOpers<1>ます。

nしかし、 2 のべき乗 (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
     }

可能ですか、またはどのマニュアルを読む必要がありますか?

アップデート。C++11 の使用は許可されており、さらに優れているでしょう。

4

2 に答える 2

6

C++11 では、このようにすることができます。まず、プライマリ テンプレートを変更して、2 番目のダミー パラメータを受け入れるようにします。

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));
}

constexpr最後に、SFINAE を使用して、関数の結果に基づいて特殊化を有効または無効にします。

#include <type_traits>

template<int n>
struct Opers<n, typename std::enable_if<is_power_of_two(n)>::type>
{
    // ...
};
于 2013-06-02T13:51:30.050 に答える
3
template <int N, typename = void>
struct Operations
{
    // ....
};

template <int N, typename = std::enable_if<(N & (N - 1))>::type>
struct Operations
{
    // ....
};
于 2013-06-02T13:56:29.987 に答える