2016-11-05 26 views
0

我有兩個文件 - 一個是我將一個無符號參數傳遞給模板,另一個包含模板聲明和定義。如何將無符號參數傳遞給模板?

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

爲什麼不直接使用一個構造函數的參數? –

+0

@Jim如果你可以在上面的示例中提供一個小例子,那將會很好。 – Scissor

+1

@JimV'std :: array'需要編譯時間常量大小。 – user4581301

回答

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); 
} 
+0

謝謝。由此解決。 – Scissor

0

不,你不能通過n在你的情況。在C++中,模板是靜態編譯的。所以它的參數必須是編譯時間常量。所以constexpr unsigned n = 10;將使編譯器很高興,但我不那麼想。

但是,如果您使用C99,它有一個稱爲可變長度數組的特性(在C11中它變成可選),它允許您聲明一個具有運行時大小的數組。

+0

可變長度數組可由編譯器擴展在某些C++編譯器中使用,但不推薦使用。由於並非所有的編譯器都支持VLA,並且支持它們的方式不同,因此移植性有限。也損壞'sizeof'的編譯時''const''s – user4581301

相關問題