如何将无符号参数传递给模板?

时间:2016-11-05 00:37:40

标签: c++ templates

我有两个文件 - 一个是我将无符号参数传递给模板,另一个是包含模板声明和定义。

/*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 吗?

编辑:我希望在编译之后可以更改线程的大小。

2 个答案:

答案 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::vectorthreadpool构造函数上的参数以及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中变成可选的),它允许你声明一个运行时大小的数组。