gpt4 book ai didi

c++ - std::numeric_limits 作为条件

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

有什么方法可以使用 std::numeric_limits<T>::is_integerstd::numeric_limits<T>::is_specialized改变模板行为?

例如我可以这样做吗:

template < typename T >
void foo( const T& bar )
{
if( std::numeric_limits< T >::is_integer )
{
isInt( bar );
}
else if( std::numeric_limits< T >::is_specialized )
{
isFloat( bar );
}
else
{
isString( bar );
}
}

最佳答案

您拥有的当前有效。但是,您应该更喜欢使用 SFINAE 和 <type_traits> 相反,因为它会根据类型分派(dispatch)到不同的函数,而不是依赖于分支条件(可能会或可能不会优化掉)。

您可以使用 std::enable_if 执行以下操作:

template<typename T, 
typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(const T& t) {
isInt(t);
}

template<typename T,
typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0>
void foo(const T& t) {
isFloat(t);
}

template<typename T,
typename std::enable_if<!std::is_integral<T>::value &&
!std::is_floating_point<T>::value, int>::type = 0>
void foo(const T& t) {
isString(t);
}

Live Demo

之所以第二个参数为enable_if设置为 int是为了节省我们一些打字。如果int被排除在外然后我们必须做typename = typename std::enable_if<std::is_integral<T>::value>::type而不是仅仅将其设置为 0这将为我们节省几个字符来输入。它们在所有意图和目的上都是等价的。

关于c++ - std::numeric_limits 作为条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25251380/

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