This answer包含以下代码:
#include <type_traits>
template<
typename T, //real type
typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type
> struct S{};
int main() {
S<int> s; //compiles
S<char*> s; //doesn't compile
}
然而,通过为模板S
指定任意的第二个类型参数,例如S<char*, void>
,T
满足is_arithmetic
的要求可以很容易地被击败。有没有办法排除这种可能性?
3条答案
按热度按时间j1dl9f461#
T满足is_arithmetic的要求很容易被推翻
我的意思是,它是SFINAE,又名替换不是一个错误.如果你想在模板中强制特定的类型,你可以使用c20中的概念,或者在c17-c++11中,你有
static_assert
:没有什么能打败它。
2wnc66cl2#
使用概念会容易得多(既然你已经提到过),
Demo
omtl5h9j3#
有没有办法排除这种可能性?
是的,有如下所示。特别是,我们可以使第二个参数成为非类型参数,并使用默认值。