gpt4 book ai didi

c++ - 在编译时/模板检查变量的值

转载 作者:行者123 更新时间:2023-11-30 01:45:36 26 4
gpt4 key购买 nike

所以,我们有这个:

template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
void fun(const T& val)
{
std::cout << "val >= 0";
}

int main()
{
fun(34);
}

想象一下我们有其他的函数重载。当 val 的值大于 0 时,如何才能使上述函数重载仅编译?

关于 http://en.cppreference.com/w/cpp/types/is_integral我看到 operator()std::is_integral 重载并且它返回 value 所以我尝试了这个:

template<typename T, typename = std::enable_if_t<std::is_integral<T>::value() > 0>>

当然,它看起来是错误的,编译器亲切地告诉我它是错误的。

如何在编译时检查变量的值?

最佳答案

简答:你不能。

函数输入参数值在运行时确定。因此,SFINAE 对此无能为力,其他任何编译时欺骗也无济于事。

您可以做的是在运行时解决问题并定义两个将被相应调用的独立函数:

template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
void fun(const T& val)
{
(val < 0)? lower_than_zero(val) : greater_equal_than_zero(val);
}

但您可能已经知道了。如果您仍在进行编译时评估,并且确定您的变量是编译时的野兽。然后你可以将它作为模板非类型参数传递:

template<int N>
std::enable_if_t<N >= 0> fun() {
std::cout << "N >= 0" << std::endl;
}

template<int N>
std::enable_if_t<N < 0> fun() {
std::cout << "N < 0" << std::endl;
}

int main() {
fun<42>();
fun<-42>();
}

关于c++ - 在编译时/模板检查变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34369580/

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