c++11 : static_assert和 type traits

static_assert提供一个编译时的断言检查。如果断言为真,什么也不会发生。如果断言为假,编译器会打印一个特殊的错误信息。


1

2

3

4

5

6

7

8

9

10

11

12

13

template <typename T, size_t Size>

class Vector

{

   static_assert(Size < 3, "Size is too small");

   T _points[Size];

};

int main()

{

   Vector<int, 16> a1;

   Vector<double, 2> a2;

   return 0;

}


1

2

3

4

5

6

7

error C2338: Size is too small

see reference to class template instantiation ‘Vector<T,Size>‘ being compiled

   with

   [

      T=double,

      Size=2

   ]

static_assert和type traits一起使用能发挥更大的威力。type traits是一些class,在编译时提供关于类型的信息。在头文件<type_traits>中可以找到它们。这个头文件中有好几种class: helper class,用来产生编译时常量。type traits class,用来在编译时获取类型信息,还有就是type transformation class,他们可以将已存在的类型变换为新的类型。

下面这段代码原本期望只做用于整数类型。


1

2

3

4

5

template <typename T1, typename T2>

auto add(T1 t1, T2 t2) -> decltype(t1 + t2)

{

return t1 + t2;

}

但是如果有人写出如下代码,编译器并不会报错


1

2

std::cout << add(1, 3.14) << std::endl;

std::cout << add("one", 2) << std::endl;

程序会打印出4.14和”e”。但是如果我们加上编译时断言,那么以上两行将产生编译错误。


1

2

3

4

5

6

7

8

template <typename T1, typename T2>

auto add(T1 t1, T2 t2) -> decltype(t1 + t2)

{

   static_assert(std::is_integral<T1>::value, "Type T1 must be integral");

   static_assert(std::is_integral<T2>::value, "Type T2 must be integral");

   return t1 + t2;

}


1

2

3

4

5

6

7

8

9

10

11

12

13

14

error C2338: Type T2 must be integral

see reference to function template instantiation ‘T2 add<int,double>(T1,T2)‘ being compiled

   with

   [

      T2=double,

      T1=int

   ]

error C2338: Type T1 must be integral

see reference to function template instantiation ‘T1 add<const char*,int>(T1,T2)‘ being compiled

   with

   [

      T1=const char *,

      T2=int

   ]

时间: 2024-10-12 10:13:16

c++11 : static_assert和 type traits的相关文章

type traits

Type Traits,  类型萃取,这个概念涉及到的内容太多.基本常用的萃取方法可以参考 http://en.cppreference.com/w/cpp/types 这里主要记录一下对函数的萃取技巧. 1 template<typename R, typename ...Args> 2 R FuncWrapper(R(*func)(Args...), Args&&... args) 3 { 4 return func(std::forward<Args>(arg

格式工厂(七)Type Traits

版权声明:本文为博主原创文章,未经博主允许不得转载. 识别变量的type id,返回true或false,举一个简单使用的例子 template <typename T> void type_traits_output(const T& x) { cout << "\ntype traits for type : " << typeid(T).name() << endl; cout << "is_void\

视频笔记 CppCon 2015:Marshall Clow “Type Traits - what are they and why should I use them?&quot;

Video: CppCon 2015:Marshall Clow "Type Traits - what are they and why should I use them?" https://www.youtube.com/watch?v=VvbTP_k_Df4 如果你需要写关于不同类型的代码,而不是具体的类型,你可能需要了解Type Traits 4:47 C++多少种类型?14 void, nullptr: 只有一个成员在这个type里面 struct 实际上和class 是一

C++ Type Traits

Custom Type Based on Type Traits #include <stdint.h> #include <string> #include <iostream> enum class SimpleType { ST_INVALID, ST_INT64, ST_UINT64, ST_DOUBLE, ST_STRING }; template<SimpleType stype> struct SimpleType2BuiltinType {

C++ 11标准STL中Traits的is_pointer的实现

在看STL的源码,发现is_pointer的模板调用,写了一个测试代码如下: #include <iostream> #include <type_traits> using namespace::std; namespace iotek{ template<typename _Tp, _Tp __v> struct integral_constant { static constexpr _Tp value = __v; typedef _Tp value_type;

c++11: trailing return type in functions(函数返回类型后置)

In C++03, the return type of a function template cannot be generalized if the return type relies on those of the template arguments. Here is an example, mul(T a, T b) is a function template that calculates the product of a and b. Arguments a and b ar

C++11 static_assert

C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言. 其语法:static_assert(常量表达式,提示字符串). 如果第一个参数常量表达式的值为false,会产生一条编译错误,错误位置就是该static_assert语句所在行,第二个参数就是错误提示字符串. 使用static_assert,我们可以在编译期间发现更多的错误,用编译器来强制保证一些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候. static_assert可以用在全局作用

C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

1.  主版本模板类 首先我们来看一段初学者都能看懂,应用了模板的程序: 1 #include <iostream> 2 using namespace std; 3 4 template<class T1, class T2> 5 class A{ 6 public: 7 void function(T1 value1, T2 value2){ 8 cout<<"value1 = "<<value1<<endl; 9 cou

C++: C++ type traits technique

C++ Traits是什么? Think of a trait as a small object whose main purpose is to carry information used by another object or algorithm to determine "policy" or "implementation details". - Bjarne Stroustrup Trait 将类型的性质.特性封装起来,可用于判断类型的特性: 这个类