2014-07-01 40 views
3

我想用我自己的std::set比較,這需要一個參數傳遞給它的構造:使用仿函數沒有對STL容器的默認構造函數

template <class T = double> class EpsCompare { 
    public: 
    EpsCompare(T input_eps) : _eps(input_eps) {}; 
    bool operator() (const T & element1, const T & element2) const { 
     return (round(element1*_eps) < round(element2*_eps)); 
    } 
    T _eps; 
}; 

我如何通過這宣告我設置數據類型?我想做這樣的事情:

std::set<double, EpsCompare<double>(1e-5)> myEpsSet; 

這不能編譯,那該怎麼辦呢?

+0

將實例傳遞給構造函數:http://en.cppreference.com/w/cpp/container/set/set – juanchopanza

+0

您**將被此比較器燒燬。決不。永遠。永遠。使用。一個。小量。什麼時候。排序。數字。永遠。 –

+0

@ n.m。爲什麼?我甚至不認爲這是典型意義上的一個小數。 – Angew

回答

5
std::set<double, EpsCompare<> > myEpsSet(EpsCompare<>(1e-5)); 

std::set<double, EpsCompare<double> > myEpsSet(EpsCompare<double>(1e-5)); 
+0

是否有任何理由將'EpsCompare '作爲第二個參數傳遞給'std :: set'模板? – Slava

+1

@Slava,是的需要。與函數模板不同,模板參數不是從參數推導出來的用於構造一個類模板的實例 –

+0

我不關注,需要什麼?如果你不把它傳遞給模板,只有'std :: set' ctor,有什麼區別它使? – Slava

1

東西作爲

#include <iostream> 
#include <set> 

template <class T = double> class EpsCompare { 
    public: 
    EpsCompare(T input_eps) : _eps(input_eps) {}; 
    bool operator() (const T & element1, const T & element2) const { 
     return (round(element1*_eps) < round(element2*_eps)); 
    } 
    T _eps; 
}; 


int main() 
{ 
    std::set<double, EpsCompare<double>> myEpsSet(EpsCompare<double>(1e-5)); 

    return 0; 
} 
1

如果你想通過eps作爲參數傳遞給std::set你必須使它模板的一部分。不能使用double作爲模板參數,因此解決方案之一,具有功率爲模板參數:

template <class T, int power > class EpsCompare { 
    public: 
    EpsCompare() { eps = pow(10, power); } 
    bool operator() (const T & element1, const T & element2) const { 
     return (round(element1*eps) < round(element2*eps)); 
    } 
    private: 
     T eps; 
}; 

std::set<double, EpsCompare<double,-5>> myEpsSet; 

如果你想通過EPS作爲參數傳遞給EpsCompare構造函數,你把它運行時,所以你不能在模板中使用它並將你的比較器傳給std::set

std::set<double,EpsCompare<double>> myEpsSet(EpsCompare<double>(1e-5)); 

就足夠了。

+0

我曾嘗試過類似的解決方案,但發現這是一個令人不滿意的解決方法,考慮到我真正想要傳遞的是間隔大小(也許是1.5或者某些東西),並不總是數字數字... – urps

+0

然後,您必須在運行時傳遞它,除非您找到一種方法將其指定爲多個整數,例如。 – Slava

相關問題