Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++_Templates_Function - Fatal编程技术网

C++ 将模板类型初始化为";“零”;

C++ 将模板类型初始化为";“零”;,c++,templates,function,C++,Templates,Function,如果我有一个模板函数,比如说一个通过对T类型容器中的元素求和来计算平均值的函数,该容器包含T::value\u类型的内容,那么我如何优雅地用零初始化和 假设基础类型不是普通的旧数据类型。它可以是一个复杂的变量,或者是其他一些尚未编码的数学实体,它有某种形式的零 比…更优雅的东西 T::value_type sum = 0; 然后希望有最好的演员 也许你想要更好的 T::value_type sum = T::value_type(); 也许你想要更好的 T::value_type sum =

如果我有一个模板函数,比如说一个通过对T类型容器中的元素求和来计算平均值的函数,该容器包含T::value\u类型的内容,那么我如何优雅地用零初始化和

假设基础类型不是普通的旧数据类型。它可以是一个复杂的变量,或者是其他一些尚未编码的数学实体,它有某种形式的零

比…更优雅的东西

T::value_type sum = 0;

然后希望有最好的演员

也许你想要更好的

T::value_type sum = T::value_type();

也许你想要更好的

T::value_type sum = T::value_type();
这里的要点是:
typename
是必须的。如果您不编写它,标准的符合编译器将给出编译错误


这里的要点是:
typename
是必须的。如果不编写,标准一致编译器将给出编译错误。

将初始值作为参数:

template<typename In, typename T>
T accumulate(In first, In last, T init);
模板
T累计(在第一个,在最后一个,T初始);

顺便说一下,这恰好是
中的
std::accumulate()
的签名。

将初始值作为参数:

template<typename In, typename T>
T accumulate(In first, In last, T init);
模板
T累计(在第一个,在最后一个,T初始);

顺便说一句,这恰好是
std::accumulate()
的签名。

您可以让用户提供初始“空”值,也可以将第一个元素作为初始值,然后从第二个元素开始执行加法。如果传递一个空列表,则只会使用默认构造函数。否则,它使用第一个元素作为初始和,并从那里开始

template <class Iterator>
typename std::iterator_traits<Iterator>::value_type average_elements(Iterator first, Iterator last) {
   typedef typename std::iterator_traits<Iterator>::value_type value_type;
   if (first == last) {
      return value_type(); // Best you can do
   }  
   value_type sum = *first++;
   size_t n = 1;
   while (first != last) {
       sum += *first++;
       ++n;
   }
   return sum / n;
}
模板
typename std::iterator_traits::value_type average_元素(iterator first,iterator last){
typedef typename std::迭代器特征::值类型值类型;
如果(第一个==最后一个){
返回值_type();//您能做的最好的事情
}  
value_type sum=*first++;
尺寸n=1;
while(第一个!=最后一个){
总和+=*第一个++;
++n;
}
返回和/n;
}

您可以让用户提供初始“空”值,也可以将第一个元素作为初始值,然后从上的第二个元素执行加法。如果传递一个空列表,则只会使用默认构造函数。否则,它使用第一个元素作为初始和,并从那里开始

template <class Iterator>
typename std::iterator_traits<Iterator>::value_type average_elements(Iterator first, Iterator last) {
   typedef typename std::iterator_traits<Iterator>::value_type value_type;
   if (first == last) {
      return value_type(); // Best you can do
   }  
   value_type sum = *first++;
   size_t n = 1;
   while (first != last) {
       sum += *first++;
       ++n;
   }
   return sum / n;
}
模板
typename std::iterator_traits::value_type average_元素(iterator first,iterator last){
typedef typename std::迭代器特征::值类型值类型;
如果(第一个==最后一个){
返回值_type();//您能做的最好的事情
}  
value_type sum=*first++;
尺寸n=1;
while(第一个!=最后一个){
总和+=*第一个++;
++n;
}
返回和/n;
}

关于
=0
有什么不雅之处?您可以执行
T::value\u类型和(0)
删除副本初始化,但这可能并没有太大的不同。令人困惑的问题。你为什么不展开,形成完整的句子呢。不要啰嗦。只需给出你想要做的事情……这两个句子都是完整正确的英语句子,除了大写字母T on之外。这个问题令人困惑。您想将某些内容初始化为零,但您不满意。。。将其初始化为零?为什么你认为这是一个问题?@Charles你的替代方案也考虑了显式系数。
=0
有什么不雅的地方?您可以执行
T::value\u类型和(0)
删除副本初始化,但这可能并没有太大的不同。令人困惑的问题。你为什么不展开,形成完整的句子呢。不要啰嗦。只需给出你想要做的事情……这两个句子都是完整正确的英语句子,除了大写字母T on之外。这个问题令人困惑。您想将某些内容初始化为零,但您不满意。。。将其初始化为零?为什么你认为这是一个问题?@Charles你的替代方案也考虑显式的构造函数。虽然值初始化通常与零初始化相同或等效,但如果目的是用零初始化,那么这肯定不如
=0。我知道,毕竟我并不反对将某个值赋给0,但它可能与OP有关。虽然值初始化通常与零初始化相同或等效,但如果目的是用零初始化,那么这肯定比
=0更不可取。我知道,毕竟我并不反对将某些内容分配给0,但这可能与OP有关。