Const接收一个var,它不能传递给模板

Const receiving a var, i cant pass it to a template

本文关键字:不能 var 一个 Const      更新时间:2023-10-16

我想做的是:

int const bitsPerInt = log2(X);
bitset<bitsPerInt>  bits(a random number...);

但是我得到这个错误:

'bitsPerInt'不能出现在常量表达式中错误:模板参数1无效

如果你真的需要它工作,你可以自己制作一个在编译时工作的log2,并把它传递给bitset的模板参数。

constexpr unsigned Log2(unsigned n, unsigned p = 0) {
    return (n <= 1) ? p : Log2(n / 2, p + 1);
}
constexpr size_t bitCount = Log2(X);
std::bitset<bitCount> bits;

生活例子。


这是使用模板元编程的解决方案,即不使用constexpr:

template<int N,unsigned int P=0>
struct Log2 { enum { value = Log2<N/2,P+1>::value }; };
template <unsigned p>
struct Log2<0, p> { enum { value = p }; };
template <unsigned p>
struct Log2<1, p> { enum { value = p }; };
std::bitset<Log2<4>::value> bits;

生活例子。

这个版本应该可以在c++ 03和c++ 11中工作;然而,如果你已经访问了c++ 11,我仍然推荐constexpr方式,因为它更干净(更容易理解)。

模板参数需要在编译时被知道(如果它是值而不是类型则是常量)。这就是模板在c++中的工作方式。模板实际上为每个特定版本的泛型代码生成真实的代码。