typedef unsigned int uint_t;
被重定义的类型并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。因此,下面这样将不是合法的函数重载:
void func(unsigned int);
void func(uint_t); // error: redefinition
typedef std::map<std::string, int> map_int_t;
// ...
typedef std::map<std::string, std::string> map_str_t;
// ...
template <typename Val> struct str_map { typedef std::map<std::string, Val> type; }; // ... str_map<int>::type map1; // ...一个虽然简单但却略显烦琐的 str_map 外敷类是必要的。这明显让我们在复用某些泛型代码时非常难受。
template <typename Val> using str_map_t = std::map<std::string, Val>; // ... str_map_t<int> map1;这里使用新的 using 别名语法定义了 std::map 的模板别名 str_map_t。比起前面使用外敷模板加 typedef 构建的 str_map,它完全就像是一个新的 map 类模板,因此,简洁了很多。
// 重定义unsigned int typedef unsigned int uint_t; using uint_t = unsigned int; // 重定义std::map typedef std::map<std::string, int> map_int_t; using map_int_t = std::map<std::string, int>;可以看到,在重定义普通类型上,两种使用方法的效果是等价的,唯一不同的是定义语法。
typedef void (*func_t)(int, int);
与之相比,using 后面总是立即跟随新标识符(Identifier),之后使用类似赋值的语法,把现有的类型(type-id)赋给新类型:using func_t = void (*)(int, int);
从上面的对比中可以发现,C++11 的 using 别名语法比 typedef 更加清晰。因为 typedef 的别名语法本质上类似一种解方程的思路。而 using 语法通过赋值来定义别名,和我们平时的思考方式一致。/* C++98/03 */ template <typename T> struct func_t { typedef void (*type)(T, T); }; // 使用 func_t 模板 func_t<int>::type xx_1; /* C++11 */ template <typename T> using func_t = void (*)(T, T); // 使用 func_t 模板 func_t<int> xx_2;从示例中可以看出,通过 using 定义模板别名的语法,只是在普通类型别名语法的基础上增加 template 的参数列表。使用 using 可以轻松地创建一个新的模板别名,而不需要像 C++98/03 那样使用烦琐的外敷模板。
void foo(void (*func_call)(int, int));
void foo(func_t<int> func_call); // error: redefinition
template <typename T>
using type_t = T;
// ...
type_t<int> i;
本文链接:http://task.lmcjl.com/news/17559.html