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並且不必複製我的代碼。
希望有人願意告訴我如何做到這一點。 感謝
如果你'ranker'永遠是類型'MPtf2ln_ranker'的?或者它應該是任何一種具有'set_param'方法的對象。 –
@ t.niese實際上MPtf2ln_ranker繼承自meta :: index :: ranker。我希望調諧函數能夠處理從meta :: index :: ranker繼承的兩個單獨的類。當我嘗試這個建議時,它似乎指向了具有該方法的meta :: index:ranker。該方法只存在於子類中。 –
使指針的實際調用如下所示:std :: unique_ptr make_ranker –