我有一个模板类,其中包含一个线程数的无符号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()的返回值不是const。
编译器说:
error: call to non-constexpr function ‘static unsigned int std::thread::hardware_concurrency()’
note: in template argument for type ‘long unsigned int’ 是否有另一种静态方法来获取模板可用的线程数?
发布于 2017-07-20 10:55:57
没有静态的方法来获取系统上逻辑CPU的数量。这个数字在编译和执行之间可以很容易地改变,例如,如果二进制文件是在不同的系统上执行的。
您可以获得从构建系统编译代码的系统逻辑CPU的数量,例如使用CMake's ProcessorCount并将其放入定义中。
发布于 2017-07-20 10:54:53
是否有另一种静态方法来获取模板可用的线程数?
答案是否定的,因为并发()不是一个constexpr函数(并发线程的数量可能因程序工作的系统而异,所以它是完全符合逻辑的,对吗?),但是num_threads必须用编译时常量初始化。
您可能需要处理一些解决方案,比如使用std::vector而不是数组:
template <typename T>
class SomeClass {
public:
SomeClass()
: values(std::thread::hardware_concurrency())
{}
private:
std::vector<T> values;
};https://stackoverflow.com/questions/45212509
复制相似问题