如何声明指向模板类成员类型的指针/引用?

时间:2017-12-06 13:09:06

标签: c++ c++11 templates pointers reference

我希望标题不会太远。请考虑以下代码:

template<class C>
struct Wrapper {
  using type = C;
};

int main()
{
  Wrapper<int>::type *a;
  Wrapper<int*>::type b;
  int i;
  Wrapper<int>::type &c = i;
  Wrapper<int&>::type d = i;
}

此处,*&可以进入模板参数,也可以附加到变量名称。虽然我认为两种声明方式都有同样的效果,但这只是我的问题:

是否有不同的方式来声明指针/引用是等价的,或者是否存在其中一个优先于另一个的情况(例如更安全,编译速度更快,样式更好......)?

1 个答案:

答案 0 :(得分:3)

  

是否有不同的方式来声明指针/引用是等价的,或者是否存在其中一个优先于另一个的情况(例如更安全,编译速度更快,样式更好......)?

不是首选,但它们可以产生实际上不同的结果。想想部分专业化

template <typename T>
struct Resource_wrapper {
    using type = T;
};

template <typename T>
struct Resource_wrapper<T*> {
   using type = std::unique_ptr<T>;
};

在这里,写Resource_wrapper<int>::type*Resource_wrapper<int*>::type之间有很大的不同。

或者考虑std::unique_ptr<>,它也使用部分特化:

std::unique_ptr<int[]> ptr; // smart pointer managing integer array
std::unique_ptr<int> ptr[5]; // array of five integer smart pointers