【发布时间】:2019-02-16 11:46:27
【问题描述】:
我正在尝试一种基于类模板参数专门化成员函数的方法,而不必在类上使用 SFINAE(并导致代码重复或创建另一个类)。
由于两个模板参数不能是可选的,并且参数enable_if在指南中不受欢迎,所以我尝试了(剩余的)以下2种方法:
template <bool boolean = true>
struct sample {
constexpr typename std::enable_if<boolean, int>::type bool_check_return(
int s) const noexcept {
return s + 1;
}
constexpr typename std::enable_if<!boolean, int>::type bool_check_return(
int s) const noexcept {
return s;
}
template <typename std::enable_if<boolean, int>::type = 0>
int bool_check_template(
int s) const noexcept {
return s + 1;
}
template <typename std::enable_if<!boolean, int>::type = 0>
int bool_check_template(
int s) const noexcept {
return s;
}
};
乍一看,我似乎并不明白为什么返回类型 SFINAE 会给出以下关于“重载不适用于仅返回类型不同的函数”的错误。 SFINAE 应该只保证一份,而不是两份。
我在不知不觉中违反了标准的哪一部分?或者这是一个编译器错误?实际上,使用 if constexpr 在 C++17 中这不是问题(而且由于一种形式有效,我可以简单地选择那个)。
此错误存在于 C++11 到 C++17 中,因此编译器出错的可能性很低。
error: functions that differ only in their return type cannot be overloaded
constexpr typename std::enable_if<!boolean, int>::type bool_check_return(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
note: previous definition is here
constexpr typename std::enable_if<boolean, int>::type bool_check_return(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
1 error generated.
【问题讨论】:
-
在这种简单的情况下,您可以改用
if constexpr。