2015-12-22 26 views
1

我有一個類,它存儲和處理T類型的數據,它只是一個模板類名。C++中是否有任何類型無關的隨機生成器?

template<class T=float> 
class myClass { 
public: 
    //... 
}; 

其中一個函數,我想生成隨機數,給定的最大絕對值。

我開始:

T randvalue = ((T)rand()/RAND_MAX)*MAX_ABS 

它與float和雙。但我想讓它與複雜的數字一起工作。如果一個double被鑄造爲complex<double>,那麼它將只有一個真實的部分。虛部保持爲零,所以我現在不能用虛部生成複數。

我不要求代碼,只是給我提示,如何開始。我想了解,我怎樣才能創建一個模板化的隨機生成器。

T是一種類型的,其中abs+-*/限定。

+0

只要使用兩個隨機數,如果該類型複雜。順便說一句。 C++有模板化的隨機數生成器,但我相信,它們只能使用fforbuiltin類型。 – MikeMB

+0

我想在沒有分支的情況下實現它,如果可能的話。複雜的只是一個例子,爲什麼我的代碼在任何情況下都不起作用。 –

+0

你不需要分支 - 你可以專門爲複雜的數字模板。你當然可以將隨機位寫入你的變量的內存地址,但我不確定,如果這總是會導致leagle值。 – MikeMB

回答

2

您可以使用過載:

的東西,如

template <typename T> struct tag {}; 
float create_random(tag<float>); 
double create_random(tag<double>); 
template<typename T> 
complex<T> create_random(tag<complex<T>> c); 

使用

T randvalue = create_random(tag<T>{}); 

或模板專業化:

template <typename T> 
struct random_generator 
{ 
    T operator()(); // you can provide default implementation. 
}; 

template <> float random_generator<float>::operator()() {/**/} 
template <> double random_generator<double>::operator()() {/**/} 
template <typename T> complex<T> random_generator<complex<T>>::operator()() {/**/} 

,並用它

T randvalue = random_generator<T>(/**/)(); 

注意:你有更好的發電機比rand<random>