gpt4 book ai didi

c++ - 偏特化的默认参数

转载 作者:行者123 更新时间:2023-11-30 03:07:40 27 4
gpt4 key购买 nike

我想在用户端实现什么语法:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com