我有两个文件 - 一个是我将无符号参数传递给模板,另一个是包含模板声明和定义。
/*File1.cc */
#include "File2.h"
int main()
{
unsigned n = 10;
ThreadPool<n> pool; //Error
.....
}
/* File_2.h */
....
namespace nbsdx {
namespace concurrent {
template <unsigned ThreadCount>
class ThreadPool {
std::array<std::thread, ThreadCount> threads;
....
};
}}
ThreadPool<n> pool;
行抛出错误并仅接受const值。有什么方法可以将 n 值传递给 ThreadCount 吗?
编辑:我希望在编译之后可以更改线程的大小。
答案 0 :(得分:1)
模板参数和std::array
的大小必须在编译时知道,以便编译器可以生成正确的代码。
选项:
静态调整一切。一切都在编译时设置,不能在运行时更改。 Documentation on constexpr
#include <array>
#include <thread>
template <unsigned ThreadCount>
class ThreadPool {
std::array<std::thread, ThreadCount> threads;
};
int main()
{
constexpr unsigned n = 10; // n is fixed at compile time and unchangable.
ThreadPool<n> pool; //Error
}
std::vector
,threadpool
构造函数上的参数以及Member Initializer List
#include <vector>
#include <thread>
class ThreadPool {
std::vector<std::thread> threads;
public:
ThreadPool(unsigned n): threads(n) // constructs threads with n elements
{
}
};
int main()
{
unsigned n = 10;
ThreadPool pool(n);
}
答案 1 :(得分:0)
不,在您的情况下,您无法将n
传递给它。在C ++中,模板是静态编译的。所以它的参数必须是编译时常量。所以constexpr unsigned n = 10;
会使编译器开心,但我不是你想要的。
但是如果你使用C99,它有一个叫做可变长度数组的特性(在C11中变成可选的),它允许你声明一个运行时大小的数组。