2016-10-18 43 views
0

這裏是我的示例代碼從原來的縮小並此編譯在我的Mac:需要幫助如何在C++自動值傳遞給函數

#include <cmath> 
#include <iostream> 
#include <random> 
#include <string> 
#include <vector> 
#include <Array> 

class ranker {}; 

namespace detail { 
    template <class T> 
    struct unique_if 
    { 
    using single_object = std::unique_ptr<T>; 
    }; 

    template <class T> 
    struct unique_if<T[]> 
    { 
    using unknown_bound = std::unique_ptr<T[]>; 
    }; 
} 

/** 
* Constructs a unique ptr in place. 
* @param args The parameters to the constructor 
* @return a unique_ptr<T> 
*/ 
template <class T, class... Args> 
typename detail::unique_if<T>::single_object make_unique(Args&&... args) 
{ 
    return std::unique_ptr<T>{new T(std::forward<Args>(args)...)}; 
} 

template <class T> 
typename detail::unique_if<T>::unknown_bound make_unique(std::size_t size) 
{ 
    return std::unique_ptr<T>{new typename std::remove_extent<T>::type[size]()}; 
} 

class MPtf2ln_ranker { 
    private: // Change the parameters to suit your ranking function 
    double lambda_ = 0; 
    double alpha_ = 0; 
    double s_ = 0; 
    double mu_ = 0; 

    public: 
    MPtf2ln_ranker(); // Default Constructor 
    MPtf2ln_ranker(double lambda, double alpha, double s, double mu); // Constructor 
    void set_param(double lambda, double alpha, double s, double mu) { 
     lambda_ = lambda; alpha_ = alpha; s_ = s; mu_ = mu; 
    }; // Sets the parameters 
    // Calculates the score for one matched term 
    double score_one(); 
};//MPtf2ln_ranker CLASS 

MPtf2ln_ranker::MPtf2ln_ranker(){}//MPtf2ln_ranker() 
MPtf2ln_ranker::MPtf2ln_ranker(double lambda, double alpha, double s, double mu) 
: lambda_{lambda}, alpha_{alpha}, s_{s}, mu_{mu} { 
}//MPtf2ln_ranker() 
double MPtf2ln_ranker::score_one() { 
    return 1.1; 
}//score_one() 

void tune() { 
    std::array<double,11> lambdaValues {{ 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 }}; 
    std::array<double,11> alphaValues {{ 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 }}; 
    std::array<double,11> sValues  {{ 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 }}; 
    std::array<double,10> muValues  {{ 0.0, 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500 }}; 

    auto ranker = make_unique<MPtf2ln_ranker>(); 
    std::size_t s, m, l, a; 
    s = 0; m=0; l=0; a=0; 
    ranker->set_param(lambdaValues[l], alphaValues[a], sValues[s], muValues[m]);  
} 

int main(int argc, char* argv[]) { 
    auto ranker = make_unique<MPtf2ln_ranker>(); 

    tune(); 
    return 0; 
} 

在main()排名器需要傳遞到tune()函數。在tune()函數中,我想註釋掉它的自動排序變量並使用傳入的變量。這將允許tune()處理多個rankers並且不必複製我的代碼。

希望有人願意告訴我如何做到這一點。 感謝

+0

如果你'ranker'永遠是類型'MPtf2ln_ranker'的?或者它應該是任何一種具有'set_param'方法的對象。 –

+0

@ t.niese實際上MPtf2ln_ranker繼承自meta :: index :: ranker。我希望調諧函數能夠處理從meta :: index :: ranker繼承的兩個單獨的類。當我嘗試這個建議時,它似乎指向了具有該方法的meta :: index:ranker。該方法只存在於子類中。 –

+0

使指針的實際調用如下所示:std :: unique_ptr make_ranker

回答

0

您可以使用模板

template <typename T> 
void tune(unique_ptr<T>& p) { /* ... */ } 

[...] 
tune(ranker); 
相關問題