传递动态模板参数

时间:2012-11-16 23:32:35

标签: c++ templates

我正在尝试使用模板,我编写了这个简单的类方法:

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函数参数传递给bitset模板。

根据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

我想我无法做到这一点......任何解决方法?

1 个答案:

答案 0 :(得分: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;
    }
}

BTW,don't use std::endl。如果您真的想要使用std::flush来刷新流。