使用模板参数键入模板函数的推断

时间:2012-04-04 16:44:48

标签: c++ templates generics types type-inference

什么是表单(如果有的话)来编写模板函数,其中参数是模板化容器?

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

2 个答案:

答案 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是默认值可构造的)