传递动态模板参数

Passing dynamic template arguments

本文关键字:参数 动态      更新时间:2023-10-16

我正在试验模板,我写了这个简单的类方法:

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++位集参考,实现确实需要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

我想我做不到...有什么解决方法吗?

模板是编译时功能,而不是运行时功能。如果您要支持的不同大小的数量有限,例如,因为您支持 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;
    }
}

顺便说一句,不要使用std::endl.如果您真的想刷新流,请使用 std::flush .