从模板参数派生返回类型

时间:2015-06-10 11:04:01

标签: c++ templates

我有一个类喜欢使用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?

1 个答案:

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