是否有可能在std中扩展扣除规则?
#include <vector>
#include <array>
namespace std {
template< class T, size_t N >
vector(array<T, N>&) -> vector<T>;
}
int main() {
std::array a = {2,3,5,7}; // array<int, 4> !
std::vector w(a);
}
Run Code Online (Sandbox Code Playgroud)
g ++ 10.0(wandbox)似乎忽略了我的版本。
根据clang9.0(也是Wandbox)在隐藏空间中的预定义规则liv:错误:推导指南必须在与模板'std :: __ 1 :: vector'相同的范围内声明
不可以,您不能这样做。std仅在极少数情况下才允许将内容放入名称空间,例如,模板专门化std::hash。在您的情况下,可以使用类模板参数推导,而键入要比期望的多一点:
std::array a = {2,3,5,7};
std::vector w(a.cbegin(), a.cend());
Run Code Online (Sandbox Code Playgroud)
请注意,括号对于初始化非常重要w,用大括号替换它们会产生完全不同的结果。
您还可以将上述构造函数调用分解为单独的帮助器模板:
template <class T, std::size_t N>
auto toVec(const std::array<T, N> a)
{
return std::vector(a.cbegin(), a.cend());
}
Run Code Online (Sandbox Code Playgroud)
这允许初始化为
std::vector w = toVec(a);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |