2012-11-16 141 views
0

我與模板實驗和我寫了這個簡單的類方法:傳遞動態模板參數

void Decimal::toBinary(size_t bits) { 
    // decimalNumber being a class private variable (long double) 
    std::bitset<bits> result(decimalNumber); 

    std::cout << result << std::endl; 
} 

我試圖通過size_t bits功能參數位集模板。

根據C++ Bitset Reference的實現確實需要的size_t參數:

template < size_t N > class bitset; 

但是,我越來越

src/decimal.cc:11: error: ‘bits’ cannot appear in a constant-expression 
src/decimal.cc:11: error: template argument 1 is invalid 
src/decimal.cc:11: error: invalid type in declaration before ‘(’ token 

我想我不能做到這一點...任何變通辦法?

+0

根據「decimalNumber」類型的不同,您可能只需要足夠長的'std :: bitset'即可脫身,它將能夠保存所有信息。 – Xymostech

+0

decimalNumber long long – jviotti

+1

您不能「傳遞動態模板參數」。這些需要在編譯時知道。 – juanchopanza

回答

2

模板是編譯時功能,而不是運行時功能。如果你要支持不同尺寸的數量是有限的,例如,因爲你支持8個,16個和32個比特,可以switch和委託:

template <size_t bits> 
void Decimal::toBinary() { 
    std::bitset<bits> result(decimalNumber); 
    std::cout << result << '\n'; 
} 
void Decimal::toBinary(size_t bits) { 
    switch (bits) { 
    default: throw std::runtime_error("number of bits not supprted"); 
    case 8: this->toBinary< 8>(); break; 
    case 16: this->toBinary<16>(); break; 
    case 32: this->toBinary<32>(); break; 
    } 
} 

順便說一句,don't use std::endl。如果您真的想要使用std::flush來刷新流。