抠腚爱揉曼 Coding Iron Man

16Aug/103

SFINAE

Posted by Jay

什么是SFINAE

在C++中有很多的编程技巧(Trick),SFINAE就是其中一种,他的全义可以翻译为“匹配失败并不是一个错误(Substitution failure is not an error)”。简单来说他就是专门利用编译器匹配失败的一种技巧。

案例

比如我们想实现一个通用的函数叫AnyToString,他可以实现任意类型的数据转成字符串:

template<typename ValueType>
char* AnyToString(const ValueType& value);

我们更希望这个函数能检查ValueType类型自己有没有ToString方法,如果有就直接调用,没有的话就采取通用的处理方案。但是C++没有反射机制,不能像C#那样通过TypeInfo来检查,更没有像Java那样纯粹的OOP,从最基类就定义了ToString方法,下面的子类只用负责重载。
所以我们希望能有一种方法能让C++也能检查某个类型是否定义了某个成员函数,这就可以用到SFINAE。

5Aug/102

N!

Posted by Jay

template<int N>
struct Factorial
{
    static const int Result = N * Factorial<N - 1>::Result;
};

template<>
struct Factorial<0>
{
    static const int Result = 1;
};
Tagged as: , 2 Comments
21Jul/100

C++中枚举与字符串相互转换

Posted by Jay

前言

有的时候我们喜欢使用一些外部的文件保存管理一些配置信息,这些配置文件大多都是文本格式例如ini,xml等,这样方便编辑和管理。因此在使用的过程中必然会遇到各种字符串转换问题。
最常见的便是将字符串的数字转换为对应的整形(integer)或者浮点(float),如果遇到枚举类型,可能便会想当做是整形来处理,但觉得不是特别理想。如果能有办法直接转换为枚举会方便很多。

2Jul/100

关于C++模板函数的一种简化代理

Posted by Jay

什么是模板

C++相较于C的一大特点除了OOP,便是它的模板化(template)功能。这也是别的语言(除了C#以外)所没有的优势。

什么是模板?简而言之它是一种预处理功能(pre-processing function),类似宏(Macro),不过比后者有着无比强大的优势。当然在C++编程里面,宏的地位也是不可替代的,而且宏经常可以和模板一起使用达到神乎其神的效果(例如boost)。
模板有具体分为模板函数(template function)和模板类(template class),这里主要是要讨论一下关于模板函数的一些问题。

27Jun/103

关于C++中的类型转换函数

Posted by Jay

函数原型

C++里面每个类型(class or struct)都可以定义自己的成员函数(方法)以及成员变量(属性),这些都是很常见基本的东西,类似的java,C#或者任何一种OOP都应该有的东西。
关于函数其中有一点比较重要的便是其函数原型,例如:

Prototype: ReturnType FunctionName(ArgumentList)
Example: int sum(int valueA, int valueB)