gpt4 book ai didi

c++ - 具有类成员函数返回类型的 enable_if

转载 作者:行者123 更新时间:2023-11-30 04:51:44 27 4
gpt4 key购买 nike

我正在尝试一种基于类模板参数来专门化成员函数的方法,而不必在类上使用 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 link

乍一看,为什么返回类型 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.

最佳答案

这里不涉及 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;
}

关于c++ - 具有类成员函数返回类型的 enable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54722710/

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