2015-12-11 39 views
6

所以,讓我們說我有這樣的代碼:如何將矢量元素作爲參數傳遞給可變參數模板函數?

template <class T1, class T2> 
auto sum(T1 a, T2 b) ->decltype(a + b) { 
    return a + b; 
} 
template <class T1, class T2, class... T3> 
auto sum(T1 a, T2 b, T3... tail) ->decltype(a + sum(b, tail...)) { 
    return a + sum(b, tail...); 
} 

我想調用函數sum的方式傳遞一個向量:

vector<double> numbers = { 1, 2, 6, 5 }; 

應該被用作參數列表功能sum。我怎樣才能做到這一點?在這種情況下,調用函數sum應該返回14。

+1

變量函數在編譯時解析,向量具有運行時確定的大小。相反,也許你應該專注於向量參數。 – jaggedSpire

+1

你也可以使用std :: array,它的大小在編譯時已知。 – Brian

+0

@Claudiu僅供參考:您的鏈接指向此處。 ;-) – jaggedSpire

回答

9

std::vector是一個運行時間的野獸。也就是說,它在堆上分配緩衝區,通常在運行時允許任何操作。另一方面,可變參數模板「剝離」在編譯期間完成。因此,std::vector和可變模板有些「不相交」。因此,用矢量做你想做的事是不可能的。

如果你想使用std::accumulate總結這可以在運行時做一個向量的元素:

std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
int sum = std::accumulate(v.begin(), v.end(), 0); 

布賴恩在評論中提到的,你可以結合使用std::array的編譯時間計算與constexpr功能。下面顯示的你如何能做到這一點的一個例子:

namespace detail { 
template <class T1, class T2> 
constexpr auto sum_(T1 a, T2 b) { 
    return a + b; 
} 
template <class T1, class T2, class... T3> 
constexpr auto sum_(T1 a, T2 b, T3... tail) { 
    return a + sum_(b, tail...); 
} 

template <typename T, std::size_t N, std::size_t... Is> 
constexpr T sum_impl(std::array<T, N> const &src, std::index_sequence<Is...>) { 
    return sum_(src[Is]...); 
} 

} 

template <typename T, std::size_t N> 
constexpr T sum(std::array<T, N> const &arr) { 
    return detail::sum_impl(arr, std::make_index_sequence<N>{}); 
} 

Live Demo

在上面的例子中,我打上你的sum功能constexpr。您還可以瞭解如何使用std::make_index_sequence將數組的元素作爲參數提供給可變參數sum函數。

相關問題