1

编写模板函数的形式是什么(如果有的话),其中参数是模板容器?

例如,我想编写一个通用总和,它适用于任何可以迭代的容器。鉴于下面的代码,我必须编写例如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;
}
4

2 回答 2

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));
于 2012-04-04T16:49:31.077 回答
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() )

(By providing a default value, the user can decide to call it with a value or else provide the template argument --but this requires the type N to be default constructible)

于 2012-04-04T16:53:00.657 回答