gpt4 book ai didi

c++ - SFINAE 不适用于 constexpr 函数?

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

为了支持可移植性,我想选择一个基于事实的常量 size_t是 32 位还是 64 位。代码:

using namespace std;

namespace detail {
template<enable_if<is_same<size_t, uint32_t>::value,void*>::type = nullptr>
constexpr static const size_t defaultSizeHelper() {
return ( (size_t) 1 << 30 ) / 2 * 5; //2,5 Gb
}
template<enable_if<is_same<size_t, uint64_t>::value,void*>::type = nullptr>
constexpr size_t defaultSizeHelper() {
return numeric_limits<size_t>::max() / 2;
}
}

constexpr static size_t defaultSize = detail::defaultSizeHelper();

由于 error: 'std::enable_if<false, void*>::type' has not been declared. template<enable_if<is_same<size_t, uint64_t>::value,void*>::type = nullptr>,此代码无法编译

编译器 - GCC 4.9

在我看来,编译器没有将 SFINAE 原则应用于 constexpr .那我该怎么办呢?

最佳答案

背后的原理SFINAE是如果推导的模板参数的替换导致格式错误的代码,那么该函数模板将从重载决议集中删除,而不是导致硬错误。

在您的情况下,没有推导的模板参数或一个替换,因此您最终会遇到编译错误。你只需要

constexpr static size_t defaultSize = is_same<size_t, uint32_t>::value 
? (( (size_t) 1 << 30 ) / 2 * 5)
: numeric_limits<size_t>::max() / 2;

出于好奇,如果你想使用 SFINAE,你可以这样做

namespace detail {
template<typename T, typename enable_if<is_same<T, uint32_t>::value,void*>::type = nullptr>
constexpr static const T defaultSizeHelper(T) {
return ( (size_t) 1 << 30 ) / 2 * 5; //2,5 Gb
}
template<typename T, typename enable_if<is_same<T, uint64_t>::value,void*>::type = nullptr>
constexpr T defaultSizeHelper(T) {
return numeric_limits<size_t>::max() / 2;
}
}

constexpr static size_t defaultSize = detail::defaultSizeHelper(size_t{});

关于c++ - SFINAE 不适用于 constexpr 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33136815/

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