Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;模板函数我可以返回一个取消引用的参数类型吗?_C++_Templates_Pointers_Iterator - Fatal编程技术网

C++ 在C++;模板函数我可以返回一个取消引用的参数类型吗?

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

我的意思如下。我想要一个模板函数,它接受两个向量迭代器(或指向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;
返回(*新的_变量);
}
因为编译器不会理解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);
}