我有一个类喜欢使用P总位数和F位小数位来表示一个固定点数(保留P-F-1整数位,保留一位作为符号位):
#include <bitset>
// Fixed point class
// P : Total number of bits
// F : Number of fractional bits
namespace FPUtils {
template <unsigned P, unsigned F> class MyFPClass {
public:
MyFPClass(std::string b="") : m_bits(b) { value = m_bits.to_ulong(); }
private:
unsigned int value;
std::bitset<P> m_bits;
};
}
现在我希望能够添加两个具有不同数量的模板参数的MyFPClass对象,并在结果中使用尽可能高的分辨率。我找到的唯一解决方案是:
template<unsigned X, unsigned Y, unsigned X1, unsigned Y1,
unsigned X2, unsigned Y2> MyFPClass<X,Y>
add(const MyFPClass<X1,Y1>& a, const MyFPClass<X2,Y2>& b){
std::cout << "In add" << std::endl;
}
我可以这样使用:
int main(){
MyFPClass<9,7> a("101000110"); // has 1 integer bit
MyFPClass<10,6> b("0111000110"); // has 3 integer bits
MyFPClass<11,7> c; // has 3 integer bits, 7 fractional bits, 1 sign bit
c = FPUtils::add<11,7,9,7,10,6>(a,b);
// How can I derive the input type directly from the input parameter, so that I can do e.g. :
// MyFPClass<9,7> c(a + b);
// or
//MyFPClass<9,7> c = a + b;
}
如何定义例如函数operator+(const MyFPClass<P1,F1>& a, const MyFPClass<P2,F2>& b)
其中P1,F1,P2,F2来自输入参数a和b?
答案 0 :(得分:1)
在c ++ 14中,std::max
是constexpr,所以你可以这样做:
template<unsigned X1, unsigned Y1, unsigned X2, unsigned Y2>
L1TopoDataTypes<std::max(Y1, Y2) + std::max(X1 - Y1, X2 - Y2), std::max(Y1, Y2)>
add(const L1TopoDataTypes<X1,Y1>& a, const L1TopoDataTypes<X2,Y2>& b){
std::cout << "In add" << std::endl;
}
之前,您可以使用三元运算符:
template<unsigned X1, unsigned Y1, unsigned X2, unsigned Y2>
L1TopoDataTypes<(Y1 < Y2 ? Y2 : Y1) + ((X1 - Y1 < X2 - Y2) ? X1 - Y1 : X2 - Y2),
(Y1 < Y2 ? Y2 : Y1)>
add(const L1TopoDataTypes<X1, Y1>& a, const L1TopoDataTypes<X2, Y2>& b){
std::cout << "In add" << std::endl;
}