繁体   English   中英

enable_if 与类成员函数的返回类型

[英]enable_if with return type for class member function

我正在尝试一种基于类模板参数专门化成员函数的方法,而不必在类上使用 SFINAE(并导致代码重复或创建另一个类)。

由于两个模板参数不能是可选的,并且参数enable_if在指南中不受欢迎,所以我尝试了(剩余的)以下两种方式:

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;
    }
};

Godbolt 链接

乍一看,我似乎不明白为什么返回类型 SFINAE 会给出以下关于“重载不适用于仅返回类型不同的函数”的错误。 SFINAE 应该确保只有一份副本,而不是两份。

我在不知不觉中违反了标准的哪一部分? 或者这是一个编译器错误? 实际上,这在 C++17 中对于if constexpr不是问题(并且由于一种形式有效,我可以简单地选择那个形式)。

这个错误出现在 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.

这里不涉及 SFINAE,因为bool_check_return本身不是模板。 它们只是常规的重载函数,仅在返回类型上有所不同。 使它们成为模板将通过只允许其中之一来解决问题:

template<bool enabled = boolean>
constexpr typename std::enable_if<enabled, int>::type bool_check_return(
    int s) const noexcept {
    return s + 1;
}

template<bool enabled = boolean>
constexpr typename std::enable_if<not enabled, int>::type bool_check_return(
    int s) const noexcept {
    return s;
}

编译器是对的。 在任何情况下,您都不能重载具有相同返回类型的两个函数,即使替换后只有一种返回类型有效。

来自[over.load]

某些函数声明不能​​重载:

  • 仅在返回类型、异常规范或两者上不同的函数声明不能​​被重载。
  • ...

这条规则也不例外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM