可以" typedef typename"被"替换为"使用" C ++ 11中的关键字

时间:2017-08-07 14:12:41

标签: c++11 typedef using typename

我知道"使用"关键字可以用作模板别名和类型别名,但我没有看到有人提到过" typedef typename"可以用"替换为"使用"。那可能吗?

2 个答案:

答案 0 :(得分:1)

以下表格的声明

typedef typename something<T>::type alias;

可以替换为

using alias = typename something<T>::type;

typename仍然是必要的,但它确实看起来更整洁,并且由于我们正在定义一个别名,因此在行的中间放置=是美学上令人愉悦的。使用的主要卖点是它可以模板化。

template <typename T>
using alias = typename something<T>::type;

单独使用typedef您无法做到这一点。 C ++ 98等价物就是这种稍微怪异的语法。

template <typename T>
struct Alias {
  typedef typename something<T>::type type;
};

// Then refer to it using typename Alias<T>::type.
// Compare to the C++11 alias<T>, which is much simpler.

using超过typedef的另一个主要卖点是,在定义函数别名时看起来更清晰。比较

// C++98 syntax
typedef int(*alias_name)(int, int);
// C++11 syntax
using alias_name = int(*)(int, int);

答案 1 :(得分:0)

如果您将其用作其他类型的别名或者您可以声明此类型,则

using可以替换类型声明。语法是:

  

使用标识符attr(可选)= type-id; (1)

     

模板&lt; template-parameter-list&gt; 使用标识符attr(可选)= type-id; (2)

type-id - 抽象声明符或任何其他有效的type-id(可能引入新类型,如type-id中所述)。 type-id不能直接或间接地将引用到标识符。

所以,这不能被单using取代,你需要两个:

typedef struct MyS 
{
   MyS *p;
} MyStruct, *PMyStruct;