我有一个带有unsigned int参数的模板类,用于线程数。我想用它来为线程创建一个静态数组。
我既不能使用std::thread::hardware_concurrency()
作为默认值
template <typename T, size_t num_threads = std::thread::hardware_concurrency()>
class Some_class{
T values[num_threads];
...
}
也不将它作为参数提供给我的班级。
template <typename T, size_t num_threads>
class Some_class{
T values[num_threads];
...
}
Some_class<int,std::thread::hardware_concurrency()> instance;
问题是std::thread::hardware_concurrency()
的返回值不是常量。
编译器说:
error: call to non-constexpr function ‘static unsigned int std::thread::hardware_concurrency()’
note: in template argument for type ‘long unsigned int’
是否有其他静态方法可以获取模板的可用线程数?
答案 0 :(得分:1)
是否有其他静态方法可以获取模板的可用线程数?
答案是 NO ,因为std::thread::hardware_concurrency()不是 constexpr 函数(并发线程数可能因程序运行的系统而异,所以它绝对符合逻辑,对吗?),但std::vector
必须用编译时常量初始化。
您可能会处理一些变通办法,例如使用template <typename T>
class SomeClass {
public:
SomeClass()
: values(std::thread::hardware_concurrency())
{}
private:
std::vector<T> values;
};
而不是数组:
{{1}}
答案 1 :(得分:0)
没有静态方法来获取系统上的逻辑CPU数量。这个数字可以在编译和执行之间轻松改变,例如如果二进制文件在另一个系统上执行。
您可以从构建系统中获取编译代码的系统的逻辑CPU数量,例如使用$project
并将其放入定义中。