我想要什麼語法實現對用戶側:默認參數
double a(1.), b(2.), deps(.1);
bool res1 = compare<double>()(a, b); // works with default eps
bool res2 = compare<double, &deps>()(a, b); // works with explicitly provided eps
float c(1.), d(1.). feps(.1);
bool res3 = compare<float>()(c, d); // don't have default eps - must not compile
bool res4 = compare<float, &feps>()(c, d); // works only with provided eps
我現在(不工作,因爲偏特默認參數是不允許的)有哪些實現了這一點:
extern double eps_double; // somewhere defined and initialized
template<typename T, const T* eps>
struct compare { // actually inherits std::binary_function
bool operator()(const T& t1, const T& t2) {
return t1 < t2 - *eps;
}
};
template<const double* eps = &eps_double>
struct compare<double, eps> { // the same as in default implementation
};
我試着用enable_if和包裝類有靜態成員,但靜態成員不能被分配給extern變量;
更新: 實際的問題是一般結構和專用結構的名稱相等。我不知道如何度過,即使沒有重命名工作:
// treats all explicitly passed eps and don't need default parameter
template<typename T, const T* eps>
struct compare_eps { // need another name!
bool operator()(const T& t1, const T& t2) {
return t1 < t2 - *eps;
}
};
// don't need default parameter either
// because we always know what eps to use for a concrete type
template<typename T>
struct compare {
// define nothing -> will not compile on types we don't have specialization for
};
template<>
struct compare<double> {
// use here eps_double hardcoded
};
對不起,這是一個錯字,正確的版本是'compare()(a,b);'粗略。請參閱我的問題更新。 –
Riga
2011-04-14 11:41:48
@Johannes,你在最後一段中的含義是什麼「如果你只提供,默認參數也會被使用,但是不起作用」? –
Nim
2011-04-14 12:12:20
@litb我無法使用最後一種方法的原因是我的專業化不僅適用於雙層,而且還適用於其他類型。 – Riga 2011-04-14 12:13:52