[英]Varying the return type of a templated member function of a class based off of a separate templated member
請原諒我標題中的措辭拙劣,我想我的例子將做更多的工作來說明我要做的事情以及面臨的問題:
這是我當前正在嘗試創建的類模板:
template<typename T>
class IID{
public:
IID(T x){a = x;}
template<typename X>
vector</*/////*/> operator()(X& rng, unsigned int n){
vector</*/////*/> returnval(n);
generate(returnval.begin(),returnval.end(),bind(a,ref(rng)));
return returnval;
};
private:
T a;
};
構造函數從C ++隨機庫獲取輸入。 這些類通過以下方式進行模板化:
uniform_int_distribution<double> T;
在下面的代碼行中,是否有辦法從上述語句中獲得“雙精度”?
vector</*/////*/> operator()(X& rng, unsigned int n){
我可以通過執行以下操作來解決該問題,但是它包含我想避免的冗余:
template<typename T, typename F>
class IID{
public:
IID(T x){a = x;}
template<typename X>
vector<F> operator()(X& rng, unsigned int n){
vector<F> returnval(n);
generate(returnval.begin(),returnval.end(),bind(a,ref(rng)));
return returnval;
};
private:
T a;
};
因為這意味着實例化IID類的成員的形式為:
uniform_real_distribution<double> dist(0,100);
IID<uniform_real_distribution<double>, double > a(dist);
到處都是多余的東西!
我寧願擁有:
uniform_real_distribution<double> dist(0,100);
IID<uniform_real_distribution<double> > a(dist);
看起來更干凈。
感謝您的時間!
假設您對用來定義類型的隨機數生成器沒有任何要求,最簡單的方法是實際上只獲取要執行的表達式的值:
template<typename T>
class IID{
public:
// ...
template<typename X>
auto operator()(X& rng, unsigned int n)
-> std::vector<decltype(std::bind(std::declval<T&>(), std::ref(rng))())> {
std::vector<decltype(std::bind(std::declval<T&>(), std::ref(rng))())> rc;
std::generate_n(std::back_inserter(rc), n, std::bind(this->a, std::ref(rng)));
return rc;
}
private:
T a;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.