gpt4 book ai didi

c++ - 对于 CLang 中的 enable_if 错误(错误 11723)是否有更好的解决方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:27 27 4
gpt4 key购买 nike

理想情况下,我们可以使用 enable_if 做类似的事情:

#include <type_traits>

namespace detail {
enum class enabler_t { DUMMY };
}

template<bool B>
using enable_if_u = typename std::enable_if<B, detail::enabler_t>::type;

template<bool B>
using disable_if_u = typename std::enable_if<!B, detail::enabler_t>::type;

template<typename T, enable_if_u<std::is_same<T, int>::value>...>
int a(){return 0;}

template<typename T, disable_if_u<std::is_same<T, int>::value>...>
double a(){return 0.0;}

int main() {
auto x = a<int>();
}

恕我直言,这是最好的使用方式。

但是,由于 bug 11723,这不适用于 Clang .

我使用的解决方法是使用虚拟 constexpr 变量:

namespace detail {
enum class enabler_t { DUMMY };
constexpr const enabler_t dummy = enabler_t::DUMMY;
}

//...

template<typename T, enable_if_u<std::is_same<T, int>::value> = detail::dummy>
int a(){return 0;}

template<typename T, disable_if_u<std::is_same<T, int>::value> = detail::dummy>
double a(){return 0.0;}

//...

我不是这种解决方法的忠实拥护者,我想知道是否还有其他解决方法可以使代码在 Clang 中运行?我正在寻找一种纯 C++ 解决方案,不涉及预处理器。

这个例子本身只是为了说明问题,它根本没有用,还有很多方法可以让它变得更好。我只想为 enable_if 部分找到一个更好的解决方法。

最佳答案

你应该只使用宏来代替:

#define ENABLE_IF(...) typename std::enable_if<(__VA_ARGS__), detail::enabler_t>::type=detail::enabler_t::DUMMY

该宏还具有避免 C++ 中最令人烦恼的解析的优点,因为它始终可以在 bool 表达式周围放置圆括号。如果觉得大写宏难看,可以用ZLang为了让它更干净,像这样:

#define BW_ENABLE_IF(...) typename std::enable_if<(__VA_ARGS__), detail::enabler_t>::type=detail::enabler_t::DUMMY
#define ZLANG_bw_enable_if (BW_ENABLE_IF)

那么如果你用-DZLANG_NS=bw编译就可以这样写:

template<typename T, $(enable_if std::is_same<T, int>())>
int a(){return 0;}

关于c++ - 对于 CLang 中的 enable_if 错误(错误 11723)是否有更好的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24454664/

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