我的意思是以下内容。我想要一个模板函数,它接受两个向量迭代器(或两个指向double数组的指针)并返回一个double,它以某种方式与我传递的向量迭代器或数组指针相关。但是,我希望这适用于double或int,或任何算术类型。
我想我不能说:
template <class T>
T* func(T Begin, T End)
T new_variable = Begin + 5;
return (*new_variable);
}
因为编译器不会理解T *的含义。我想到的解决方案是采取我想要返回的内容并将其作为第三个参数:
template <class T>
void func(T Begin, T End, T* new_variable)
new_variable = Begin + 5;
return (*new_variable);
}
这会有用吗?即便如此,还有另一种方法可以做我想做的事情吗? (对不起,如果我还不够清楚的话。)
答案 0 :(得分:10)
如果要返回double(即解除引用时可以获得的类型),可以使用迭代器特征:
template<typename RandomAccessIterator>
typename std::iterator_traits<RandomAccessIterator>::value_type
func(RandomAccessIterator a, RandomAccessIterator b) {
typedef typename std::iterator_traits<RandomAccessIterator>::value_type
value_type;
// use value_type now, when you want to save some temporary
// value into a local variable, for instance
value_type t = value_type();
for(; a != b; ++a) t += *a;
return t;
}
这些适用于所有迭代器,包括指针:
int main() {
int d[3] = { 1, 2, 3 };
assert(func(d, d + 3) == 6);
}
答案 1 :(得分:3)
好吧,你的代码似乎与你在文中描述的内容相矛盾。如果T
是迭代器类型,则迭代器取消引用的结果(正如您在文中所述)将不具有类型T *
(因为你似乎相信代码)。 T *
是完全相反的事情:如果你使用迭代器的地址而不是取消引用它,那么你就会得到它。
事实上,没有办法使用C ++核心语言功能来表达“解除引用类型”(可能decltype
将来会这样做,如decltype(*T())
)。描述类型T
的解除引用结果的唯一方法是使用基于库的解决方案:迭代器特征,正如Johannes在他的回答中所解释的那样。