【发布时间】:2015-09-02 23:50:32
【问题描述】:
如果我有一个模板函数接受指向模板类型的指针:
template<typename T>
void foo(const T* x);
它自然接受指向非 const 对象的指针:
int* x = ...;
foo(x); //int* implicitly converted to const int *
我想对具有指针语义的模板类做同样的事情。
例如,最近提出的array_view 类是一个连续内存块的视图,具有(非拥有)指针语义,可用于引用可变或常量项数组:
array_view<int> av = ...;
av[0] = 1;
array_view<const int> cav = ...;
cav[0] = 1; // <- error: read-only variable is not assignable
问题是上面带有原始指针的模式不起作用:
template<typename T>
void foo(array_view<const T> x);
...
array_view<int> x;
foo(x); // <- error: no matching function for call to 'foo'
即使我添加了在T 和const T 变体之间转换的复制构造函数或转换运算符,编译器也无法解析模板的T。
我知道两种解决方法:
- 在调用时明确指定模板参数:
foo<int>(x) - 编写一个更通用的模板:
template<typename U> void foo(U x),并可能使用元编程约束U。
有没有更好的解决方案?
【问题讨论】:
标签: c++ templates constants implicit-conversion