禁止代码为非整数类型编译
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;
}
#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;
}