重映射模板参数struct

时间:2017-02-25 20:22:31

标签: c++ c++11 templates

我是模板新手,想知道如何做到以下几点: 我有一个固定点结构,允许定点计算,定义如下:

template<int bits, int offset>
struct Fixed {
      int64_t raw;
      inline Fixed() {}
      ...
}

我想扩展它,以便我可以声明一个自定义的浮点表示,编译器将其转换为正确的定点定义。我尝试了如下:

template<int totBits, int expBits, int expOffset>
struct Fixed<exp2(expBits)+totBits-expBits-2,expOffset-totBits+expBits> {
       inline Fixed() {}
       inline explicit Fixed(double value) {
               Quantization function of floating point here
       }
};

然而,这给了我错误: “模板参数涉及模板参数”。

如何重新映射初始模板,以便我可以执行以下操作:fixed::Fixed<8,3,0> foo; 编译器将其视为:fixed::Fixed<11,-3> foo;

我知道当我为foo分配一个值时,我必须手动量化它,好像它被存储为一个浮点:例如将赋予foo = 240和foo = fixed::Fixed<8,3,0>(243)的{​​{1}}将给foo = 248。

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是npm install -g webpack make: npm: No se encontró el programa Makefile:24: fallo en las instrucciones para el objetivo 'install' make: *** [install] Error 127 jsevillamol@jsevillamol-N551JK:~/twitter-feed-eradicator$ make install BROWSER=firefox npm install -g webpack make: npm: No se encontró el programa Makefile:24: fallo en las instrucciones para el objetivo 'install' make: *** [install] Error 127 jsevillamol@jsevillamol-N551JK:~/twitter-feed-eradicator$ make install BROWSER='firefox' npm install -g webpack make: npm: No se encontró el programa Makefile:24: fallo en las instrucciones para el objetivo 'install' make: *** [install] Error 127 jsevillamol@jsevillamol-N551JK:~/twitter-feed-eradicator$ make install BROWSER='firefox' webpack npm install -g webpack make: npm: No se encontró el programa Makefile:24: fallo en las instrucciones para el objetivo 'install' make: *** [install] Error 127 使用Fixed<bits, offset>作为Fixed<totBits, expBits, expOffset>的特化,使用无效值expOffset

// Forward definition.  Third parameter defaults to an invalid value for expOffset.
// Replace default if necessary.
template<int, int, int = 256>
struct Fixed;

// "Main" specialisation.  Used when third parameter is an invalid expOffset.
// Specialises for when third parameter is default.
template<int bits, int offset>
struct Fixed<bits, offset, 256> {
    int64_t raw;
    inline Fixed() {}

    // Dummy implementation for example.
    inline Fixed(int64_t value) : raw(24) {
        std::cout << "Fixed<" << bits << ", " << offset << ">(" << value << ")\n";
    }
};

// Non-specialised implementation, used for any other value of expOffset.
// Inherits from main specialisation.
template<int totBits, int expBits, int expOffset>
struct Fixed : Fixed<static_cast<int>(exp2(expBits))+totBits-expBits-2,expOffset-totBits+expBits> {
    using MyBase = Fixed<static_cast<int>(exp2(expBits))+totBits-expBits-2,expOffset-totBits+expBits>;

    // Dummy implementation for example.
    inline explicit Fixed(double value) : MyBase(42) {
        std::cout << "Fixed<" << totBits << ", " << expBits << ", " << expOffset << ">(" << value << ")\n";
    }
};

这允许第二个变体的实例化从第一个变体的适当实例化继承,同时使用相同的名称。

int main() {
    std::cout << "f1:\n";
    Fixed<11, -3> f1(1);
    std::cout << "\nf2:\n";
    Fixed<8,3,0>  f2(1.0);
}

Output

f1:
Fixed<11, -3>(1)

f2:
Fixed<11, -5>(42)
Fixed<8, 3, 0>(1)

请注意,这实际上是正常继承,尽管基类和派生类都是同一模板的特化;因此,将第二个版本作为一个单独的类可以更清楚地传达您的意图。