簡體   English   中英

根據單獨的模板化成員來改變類的模板化成員函數的返回類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM