C++14 引入了许多新特性和语言改进,下面是其中一些主要的特性:
1、泛型 Lambda 表达式
2、constexpr 函数中的更多功能
3、std::make_unique
4、std::index_sequence 和相关功能
5、std::exchange 函数
6、std::integer_sequence 和相关功能
7、std::quoted 用于 IO 操作
8、变量模板
根据不同的类型去定义一个变量有哪些方法。
#include <iostream>
using namespace std;
template <class T>
struct PI
{
static constexpr T value = static_cast<T>(3.1415926);
};
int main(int argc, char **argv)
{
std::cout << PI<float>::value << std::endl; // 3.14159
return 0;
}
#include <iostream>
using namespace std;
template <class T>
constexpr T PI()
{
return static_cast<T>(3.1415926);
};
int main(int argc, char **argv)
{
std::cout << PI<int>() << std::endl; // 3
return 0;
}
C++14标准引入了变量模板的特性。
#include <iostream>
using namespace std;
template <class T>
constexpr T PI = static_cast<T>(3.1415926L);
int main(int argc, char **argv)
{
std::cout << PI<float> << std::endl; // 3.1415926
std::cout << PI<int> << std::endl; // 3
return 0;
}
变量模板的模板参数也可以是非类型的
#include <iostream>
using namespace std;
template <class T, int N>
= static_cast<T>(3.1415926L) * N;
T PI
int main(int argc, char **argv)
{
<float, 2> *= 5;
PIstd::cout << PI<float, 2> << std::endl; // 31.4159
return 0;
}
有了变量模板,有一个好处就是用于模板元编程,如比较两个类型是否相同时会用到
bool b = std::is_same<int,std::size_t>::value;
但是::value
有些鸡肋,可以用变量模板
template<class T1, class T2>
constexpr bool is_same_v = std::is_same<T1, T2>::value;
bool b = is_same_v<int, std::size_t>;
不过C++14标准库并没有is_same_v
,知道C++17标准库的type_traits中对类型特征采用了变量模板,比如
some_trait<T>::value
会增加与它等效的变量模板some_trait_v<T>
。