C++ 从true值到std::true\u类型的隐式转换
这是我为学习C++而编写的一个简单的模板程序:C++ 从true值到std::true\u类型的隐式转换,c++,templates,c++11,typetraits,C++,Templates,C++11,Typetraits,这是我为学习C++而编写的一个简单的模板程序: #include <type_traits> #include <iostream> using namespace std; template<typename T> T foo(T t, true_type) { cout << t << " is integral! "; return 2 * t; } template<typename T> T
#include <type_traits>
#include <iostream>
using namespace std;
template<typename T>
T foo(T t, true_type)
{
cout << t << " is integral! ";
return 2 * t;
}
template<typename T>
T foo(T t, false_type)
{
cout << t << " ain't integral! ";
return -1 * (int)t;
}
template<typename T>
T do_foo(T t){
return foo(t, is_integral<T>());
}
int main()
{
cout << do_foo<int>(3) << endl;
cout << do_foo<float>(2.5) << endl;
}
#包括
#包括
使用名称空间std;
模板
T-foo(T-T,真型)
{
cout是一个继承自true\u type
或false\u type
的类型
is\u integral()
是一个构造函数调用,因此其中一个类型的实例是调用foo
的参数。然后根据它是哪个重载来选择重载。它不是调用操作符()
,而是构造一个临时的,就像int()
。注意:为了避免混淆,在C++11中,这可能是is_integral{}
@MatthieuM。任何他们为什么添加新符号的指针?()
符号看起来更像是创建一个实例,而不是{}
这看起来像定义。@dashesy:除此之外,它还允许在不破坏向后兼容性的情况下修改初始化规则(在类型转换时)。