【发布时间】:2013-06-30 06:18:46
【问题描述】:
假设我有一个模板函数assign()。它接受一个指针和一个值,并将值分配给指针的目标:
template <typename T> void assign(T *a, T b) { *a = b; }
int main() {
double i;
assign(&i, 2);
}
在这种情况下,我总是希望从第一个参数推导出 T,但看起来我没有很好地表达这一点。 2的类型是int,所以:
deduce.cpp:5:5: error: no matching function for call to 'assign'
赋值(&i, 2);
^~~~~~
推断.cpp:1:28:注意:候选模板被忽略:推断参数“T”的冲突类型(“双”与“整数”)
模板无效分配(T *a,T b){ *a = b; }
有没有办法可以声明assign(),使第二个参数不参与模板参数推导?
【问题讨论】:
-
所以,上面的一个问题是效率低下。假设
T是std::vector。参数b按值获取,然后复制(未移动)到a。一个小的改进可能是将assign的实现更改为*a = std::move(b),这对于原始类型来说没有任何成本,而对于复杂类型来说可以节省很多。一个很大的改进是完善转发b。 -
@Yakk 完全同意——我只是把它写成一个函数的例子,它接受一个指针和相同类型的值。实际上它只需要原语并且比这家伙更有用:)。
标签: c++ templates template-argument-deduction