什么是表单(如果有的话)来编写模板函数,其中参数是模板化容器?
例如,我想编写一个通用和,它将适用于任何可以迭代的容器。鉴于下面的代码,我必须编写例如sum<int>(myInts)
。我更愿意只写sum(myInts)
和从myInts包含的类型推断的类型。
/**
@brief Summation for iterable containers of numerical type
@tparam cN Numerical type (that can be summed)
@param[in] container container containing the values, e.g. a vector of doubles
@param[out] total The sum (i.e. total)
*/
template<typename N, typename cN>
N sum(cN container) {
N total;
for (N& value : container) {
total += value;
}
return total;
}
答案 0 :(得分:3)
我写了这样的函数
template<typename IT1>
typename std::iterator_traits<IT1>::value_type //or decltype!
function(IT1 first, const IT1 last)
{
while(first != last)
{
//your stuff here auto and decltype is your friend.
++first;
}
return //whatever
}
这样它不仅可以使用容器,例如ostream迭代器和目录迭代器。
像
一样打电话function(std::begin(container), std::end(container));
答案 1 :(得分:0)
即使很麻烦,这可以在C ++ 11中实现这个技巧:
template <typename C>
auto sum( C const & container )
-> std::decay<decltype( *std::begin(container) )>::type
另一种选择是使用与累积相同的结构:让调用者传递一个带有初始值的额外参数,并使用它来控制表达式的结果:
template<typename N, typename cN>
N sum(cN container, N initial_value = N() )
(通过提供默认值,用户可以决定使用值调用它,或者提供模板参数 - 但这需要类型N是默认值可构造的)