2014-01-21 62 views
0

如果我有一個函數,我怎樣才能傳入一個C++ 11隨機數生成器(如std::mt19937)作爲參數傳遞給非模板函數,而不會強制調用者使用哪個RNG?你如何通過<random> RNG作爲非模板函數的參數?

它似乎不像C++ 11隨機數生成器共享一個共同的基礎。 我是不是強制要麼使用模板,要麼強制使用特定的生成器?

有一兩件事我想是在將它作爲std::function<int()>,但是,唉,諸如此類的std :: uninform_distribution需要operator()max()min()爲成員函數。

如果像std::uninform_distribution這樣的東西期望並需要一個通用的接口,是否有一些生成器繼承的基礎接口,我可以將它作爲通用引用?

+0

你有什麼反對使用模板參數? –

+0

@JosephMansfield因爲如果它是一個模板函數,那麼我必須把它放在頭文件中(或者跳過箍筋),如果我必須把它放在頭文件中,那麼我必須包含其他東西功能需求,減慢構建時間。我不反對模板功能 - 我很多地使用它們!只是在這種情況下,看起來相當愚蠢的是沒有共同的接口,除了採用這個參數之外,整個功能根本不需要成爲模板。通過作爲模板函數,我必須減少預先聲明的數量以支持#includes。 –

+0

我只是直接傳遞std :: mt19937,謝謝。 –

回答

0

它們不是從共同的基礎派生的,因爲它們不打算多形地使用。所以是的,如果你需要的不僅僅是operator()(作爲std::function<std::mt19937::result_type()>會給你傳遞),那麼你需要把它作爲一個函數模板。


當概念使其進入語言,我們就可以做這樣的事情:

void foo(RandomNumberEngine engine); 

而且概念RandomNumberEngine的要求也會對傳遞參數進行檢查。

+2

關於你對概念的評論:如果'RandomNumberEngine'是一個概念,那麼'void foo(RandomNumberEngine engine);'是一個模板,所以如果需要的話,概念不能使用避免模板。 – bames53

+0

@ bames53我不是故意暗示它不是模板。我的觀點是,如果它們是多態類型,它將提供類似的接口。 –

相關問題