禁止代码为非整数类型编译

disable code from compiling for non integral types

#include <iostream>
#include <type_traits>
#include <math.h> 

template<typename T>
void Foo(T x)
{
    if(std::is_integral<T>::value)
    {
        rint(x);
    }
    else
    {
        std::cout<<"not integral"<<std::endl;
    }
}
int main()
{
    Foo("foo");
    return 0;
}

不编译,因为 const char* 没有合适的 rint 重载,但 rint 永远不会被 const char* 调用,因为它不是整数类型。我怎样才能通知编译器这个

c++17 中,您可以使用 if constexpr 而不是 if,它会起作用。

c++14 中你可以特化一个结构来做你想做的事情

template<class T, bool IsIntegral = std::is_integral<T>::value>
struct do_action
{
    void operator()(T val) { rint(val); }
};

template<class T>
struct do_action<T, false>
{
    void operator()(T val) { std::cout << "Not integral\n"; }
};

template<class T>
void Foo(T x)
{
    do_action<T>()(x);
}

一种方法是使用 std::enable_if,如下所示:

template<typename T>
typename std::enable_if<std::is_integral<T>::value>::type Foo(T x)
{
    std::cout<<"Foo called for integral type"<<std::endl;
    rint(x);   
}
template<typename T>
typename std::enable_if<!std::is_integral<T>::value>::type Foo(T x)
{
    std::cout<<"non-integral type"<<std::endl;
       
}
int main()
{
    Foo(5);// calls Foo integral type
    Foo('c'); //calls Foo for integral type
    Foo("c"); //call Foo for non-integral type
    return 0;
}