gpt4 book ai didi

c++ - 有什么方法可以实现类似 std::is_integral 文字的东西吗?

转载 作者:太空狗 更新时间:2023-10-29 21:13:48 27 4
gpt4 key购买 nike

假设我们有两个函数:

//(1)
template<class T ,
class = typename std::enable_if<std::is_integral<T>::value & ! is_integral_literal<T>::value>::type >
void foo(T)
{
}

//(2)
template<class T ,
class = typename std::enable_if<is_integral_literal<T>::value>::type >
void foo(const T&)
{
}

所以

int x;
foo(x); //calls (1)
foo(0); //calls (2)
foo(1000); //calls (2)

如何实现 is_integral_literal?我用 operator ""_int_lit(long long) 做了一些解决方法,这让我能够用foo(0_int_lit),但是否还有其他解决方案?

最佳答案

一种方法可能是利用整数文字是右值这一事实?那么如果你的函数签名是

template <typename T,
typename = std::enable_if_t<std::is_integral<T>::value>>
T f(T&& t) {
return t;
}

用右值调用时 int (像文字一样),T将被推断为普通 int , enable_if 条件将成立并且将考虑此过载。但是当用左值调用时,例如

int i = 0;
f(i);

然后 T将被推断为 int& , 在这种情况下 is_integral<int&>::value为假,SFINAE 将启动。然后您可以添加第二个重载,如

template <typename T,
typename = std::enable_if_t<std::is_integral<T>::value>>
T f(const T& t)
{
return t;
}

处理左值情况(当使用右值调用时,将考虑两个重载,但第一个将是更好的匹配)。

这并不完全完全符合要求,因为仍然可以通过调用 f(std::move(i)) 强制使用非文字的第一个重载。 ,但我不知道这对您的用例来说是否会成为问题。

关于c++ - 有什么方法可以实现类似 std::is_integral 文字的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42906710/

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