作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在用户端实现什么语法:
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 和包装类,但不能将静态成员分配给外部变量;
更新:实际问题是通用结构和专用结构的名称相等。我不知道如何在不重命名的情况下使其工作:
// 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<double, deps>
你不能让它工作:模板参数不能是 double
类型的值(它们可以是 double
类型的左值,但您的模板需要 double
的地址,因此关闭)。
您可以使用函数模板来使您的语法有效
extern double eps_double;
template<typename T>
types::compare<T, &eps_double> compare(
typename enable_if<is_same<T, double>>::type * = 0
) {
return types::compare<T, &eps_double>();
}
template<typename T, const T *eps>
types::compare<T, eps> compare() {
return types::compare<T, eps>();
}
或者,如果你想要一些丑陋的 hack,你可以使用类模板
template<typename T, const T* eps = &eps_double>
struct compare {
bool operator()(const T& t1, const T& t2) {
return t1 < t2 - *eps;
}
};
如果您同时提供这两个参数,则不会使用默认参数。如果您只提供 <double>
, 默认参数将被使用并起作用。如果你只提供 <float>
,也会使用默认参数,但不会起作用。
关于c++ - 偏特化的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5661637/
我是一名优秀的程序员,十分优秀!