C,如何使用所有型別的子集
我正在寫一個函式,我想接受一個分佈作為引數.下面我們來說一下:
#include<random> #include<iostream> using namespace std; random_device rd; mt19937 gen(rd()); void print_random(uniform_real_distribution<>& d) { cout << d(gen); }
現在有沒有辦法在C中簡單地推廣這個程式碼,以便它只接受所有的發行版和發行版(否則編譯器應該投訴)?編輯:為了澄清,解決方案也應該只能接受所有發行版的一個子集(必須預先指定).
我會例如接受將型別定義為允許的型別的集合的能力,但是如果已經有一個具有此屬性用於分發的型別,則會更好.
標準庫中沒有這樣的特徵.你可以寫一些類似的東西
template<typename T> struct is_distribution : public std::false_type {};
並專門為每種型別,即分配
template<typename T> struct is_distribution<std::uniform_int_distribution<T> > : public std::true_type {};
然後就是
template<typename Distr> typename std::enable_if<is_distribution<Distr>::value>::type print_random(Distr& d) { cout << d(gen); }
此外,您可以使用諸如concept-lite(但是使用declype,因為現在沒有此功能),在某些情況下無法工作.在標準中有規則,任何分配應遵循(n3376 26.5.1.6 /表118).
template<typename D> constexpr auto is_distribution(D& d) -> decltype(std::declval<typename D::result_type>(), std::declval<typename D::param_type>(), d.reset(), d.param(), d.param(std::declval<typename D::param_type>()), true); template<typename D> auto print_random(D& d) -> decltype(is_distribution(d), void()) { }
如果你想只是檢查該型別是可呼叫的一些生成器和執行這個呼叫返回result_type你可以簡單的功能
template<typename D> auto is_distribution(D& d) -> decltype(std::is_same<typename D::result_type, decltype(d(*static_cast<std::mt19937*>(0)))>::value);
所有這些事情將會很簡單,當概念-lite將在標準中可用.
http://stackoverflow.com/questions/27482972/c-how-to-use-a-subset-of-all-types