我是模板新手,想知道如何做到以下几点: 我有一个固定点结构,允许定点计算,定义如下:
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。
答案 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);
}
f1:
Fixed<11, -3>(1)
f2:
Fixed<11, -5>(42)
Fixed<8, 3, 0>(1)
请注意,这实际上是正常继承,尽管基类和派生类都是同一模板的特化;因此,将第二个版本作为一个单独的类可以更清楚地传达您的意图。