C++ 在C++;模板函数我可以返回一个取消引用的参数类型吗?
我的意思如下。我想要一个模板函数,它接受两个向量迭代器(或指向double数组的两个指针),并返回一个与我传递的向量迭代器或数组指针相关的double。但是,我希望它适用于double、int或任何算术类型 我想我不能说:C++ 在C++;模板函数我可以返回一个取消引用的参数类型吗?,c++,templates,pointers,iterator,C++,Templates,Pointers,Iterator,我的意思如下。我想要一个模板函数,它接受两个向量迭代器(或指向double数组的两个指针),并返回一个与我传递的向量迭代器或数组指针相关的double。但是,我希望它适用于double、int或任何算术类型 我想我不能说: template <class T> T* func(T Begin, T End) T new_variable = Begin + 5; return (*new_variable); } 模板 T*func(T开始,T结束) T新_变量=开始+5
template <class T>
T* func(T Begin, T End)
T new_variable = Begin + 5;
return (*new_variable);
}
模板
T*func(T开始,T结束)
T新_变量=开始+5;
返回(*新的_变量);
}
因为编译器不会理解t*的意思。我想到的一个解决方案是,将我试图返回的内容作为第三个论点:
template <class T>
void func(T Begin, T End, T* new_variable)
new_variable = Begin + 5;
return (*new_variable);
}
模板
void func(T开始、T结束、T*新变量)
新的_变量=开始+5;
返回(*新的_变量);
}
这样行吗?即使是这样,有没有其他方法来做我想做的事情?(如果我不够清楚,很抱歉。)如果要返回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;
}
嗯,您的代码似乎与您在文本中描述的内容相矛盾。如果
T
是迭代器类型,那么迭代器取消引用的结果(正如您在本文中所说)将不会具有类型T*
(正如您似乎相信代码一样)T*
是一个完全相反的东西:如果您获取迭代器的地址,而不是取消引用它,您就会得到它
事实上,没有办法用C++核心语言来表达“去类型”(可能是<代码> DECKECTON/COD>将来会做,如<代码> DECKET(*T-())< /代码>。描述类型
T
的解引用结果的唯一方法是使用基于库的解决方案:迭代器特性,正如Johannes在回答中所解释的那样。请注意,编译器确实理解模板函数返回类型中的T*
;问题是*新变量的类型不是t*
。这似乎正是我所需要的!不过有几点:1)我认为您忘记初始化for循环了。2) 使用typedef命名一个新类型并将其称为value\u type是否可以?这不是保留的关键字吗?3)我不知道迭代器的特性,因为我正在阅读C++加速。我能在约瑟蒂斯的书中找到更多关于它的信息吗?@jackj 1)如果你不需要,可以省略for循环的初始部分。“t”完全初始化为value_type(0表示int)的默认值,2)是,value_type不保留。我们可以使用它来缩短长类型名称。3) 是的,约瑟蒂斯的书应该包括这一点。:)哇!这是我第一次使用stackoverflow,但我知道我会回来的。你们太棒了!非常感谢。@jackj:你应该点击upvote/downvote窗口小部件左侧的复选标记,以便其他人知道你已经接受了这个答案。谢谢outis和AndreyT。你是对的,代码确实与我所想的相矛盾。我猜我在C++中使用了一元指针来声明指针,也就是去引用指针或迭代器,但是这两个东西是分开的。:不幸的是,这会导致像T*a,b
,它定义了T*
和T
。这也是为什么它是T id[n]
而不是T[n]id
:因为id[n]
的类型是T
@jackj:如果您在类型声明方面有问题,请尝试阅读或。我看到的最简单的描述(以及语法的原因)来自:假设声明是一个表达式,其值是声明开头命名的类型(例如,对于T(*d)[2]
,将(*d)[1]
看作T
)。
int main() {
int d[3] = { 1, 2, 3 };
assert(func(d, d + 3) == 6);
}