C++ Const收到一个var,我无法将其传递给模板
我想做的是:C++ Const收到一个var,我无法将其传递给模板,c++,C++,我想做的是: int const bitsPerInt = log2(X); bitset<bitsPerInt> bits(a random number...); int const bitsprint=log2(X); 位集位(随机数…); 但我得到了这个错误: “BitsPrint”不能出现在常量表达式中 错误:模板参数1无效 模板参数需要在编译时已知(如果是值而不是类型,则为常量)。这就是模板在C++中的工作方式。模板实际上会为每个特定版本的通用代码生成真实的代码。如
int const bitsPerInt = log2(X);
bitset<bitsPerInt> bits(a random number...);
int const bitsprint=log2(X);
位集位(随机数…);
但我得到了这个错误:
“BitsPrint”不能出现在常量表达式中
错误:模板参数1无效
模板参数需要在编译时已知(如果是值而不是类型,则为常量)。这就是模板在C++中的工作方式。模板实际上会为每个特定版本的通用代码生成真实的代码。如果确实需要这样做,请创建自己的在编译时工作的
log2
,并将其传递给位集的模板参数
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;
这个版本应该可以在C++03和C++11中使用;但是,如果您可以访问C++11,我仍然建议使用
constepr
方法,因为它更干净(更容易理解)。使用std::vector
log2(X)可以在编译时知道吗?可能重复:错误很明显BitsPrint
是一个常量,但不是一个常量表达式akaconstexpr
我想模板元编程也有一种方法,但我还没有完全做到。尽管如此,这是一个不错的解决方案。是的,如果你没有访问C++11的权限,那么元编程也可以这样做。有一种方法可以做到这一点,而不需要使用constexpr吗?因为它是c++11,除此之外,我还不熟悉constexpr。。。谢谢你的帮助@埃里克福廷:那里!添加了元编程版本,因为OP要求它:)@ViperAlpha:我也添加了这个案例,但它需要您了解一点元编程。两者都只在编译时工作;如果你真的有X
的变量值,那么bitset
不适合你,你应该使用vector
。是的,我知道,但问题是,它的变量,没有办法做到这一点?使用模板和运行时值,没有。
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;