2015-06-10 2 views
-1

У меня есть класс, который представляет число с фиксированной точкой, используя P общее количество бит и F число дробных битов (оставляя целые биты PF-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

Что такое формула для 'P' выходного в и 'F' на основе входов' 'P' и 'F's? – Angew

+0

Что такое downvotes? Вопрос гораздо яснее и гораздо более согласован, чем большинство первых вопросов. – Angew

+0

исправить 'l1a' и' l1b'. также 'l1d' vs' c', и не смешивать в 'operator +' в вопросе, это действительно не актуально. –

ответ

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; 
} 
Смежные вопросы