我希望标题不会太远。请考虑以下代码:
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;
}
此处,*
和&
可以进入模板参数,也可以附加到变量名称。虽然我认为两种声明方式都有同样的效果,但这只是我的问题:
是否有不同的方式来声明指针/引用是等价的,或者是否存在其中一个优先于另一个的情况(例如更安全,编译速度更快,样式更好......)?
答案 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