如何检查模板的参数类型是否为整数?

时间:2010-08-11 13:01:30

标签: c++ templates

在一些std模板函数的描述中,我看到了类似的东西:

  

如果模板参数是整数类型,则行为是这样的   否则就是这样等等。

我该如何进行类似的测试?也许是dynamic_cast?

由于我写的功能仅供我个人使用,我可以依靠自己只提供正确的参数,但为什么错过学习的机会? :)

4 个答案:

答案 0 :(得分:4)

除了其他答案之外,应该注意的是,测试可以在运行时使用,也可以在编译时使用,以根据类型是否为完整来选择正确的实现:

运行时版本:

// Include either <boost/type_traits/is_integral.hpp> (if using Boost) 
// or <type_traits> (if using c++1x)
// In the following, is_integral shoudl be prefixed by either boost:: or std::

template <typename T>
void algorithm(const T & t)
{
    // some code

    if (is_integral<T>::value)
    {
        // operations to perform if T is an integral type
    }
    else
    {
        // operations to perform if T is not an integral type
    }

    // some other code
}

然而,当算法的实现很大程度上取决于测试时,可以改进该解决方案。在这种情况下,我们将在函数顶部进行测试,然后是一个大then块和一个大else块。在这种情况下,常见的方法是重载函数并使编译器使用SFINAE选择正确的实现。一种简单的方法是使用boost::enable_if

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_integral.hpp>

template <typename T>
typename boost::enable_if<boost::is_integral<T> >::type
algorithm(const T & t)
{
    // implementation for integral types
}

template <typename T>
typename boost::disable_if<boost::is_integral<T> >::type
algorithm(const T & t)
{
    // implementation for non integral types
}

当调用algorithm函数时,编译器将“选择”正确的实现,具体取决于模板参数是否为整数。

答案 1 :(得分:3)

One possibility

#include <type_traits> 
#include <iostream> 

struct trivial 
{ 
    int val; 
}; 

int main() 
{ 
    std::cout << "is_integral<trivial> == " << std::boolalpha 
        << std::is_integral<trivial>::value << std::endl; 
    std::cout << "is_integral<int> == " << std::boolalpha 
        << std::is_integral<int>::value << std::endl; 
    std::cout << "is_integral<float> == " << std::boolalpha 
        << std::is_integral<float>::value << std::endl; 

    return (0); 
} 

然后,您可以使用std::is_integral<>来确定操作。

答案 2 :(得分:2)

如果您无法使用C ++ 11功能,std::numeric_limits<T>::is_integerthe same thing作为std::is_integral<T>::value,并且可以使用C ++ 98。

请注意,98版本是inte ger ,而非inte gral

答案 3 :(得分:1)

Boost.TypeTraits提供is_integral&lt;&gt;(),如另一个响应中所述,如果您的编译器还不支持下一个标准的C ++功能。