簡體   English   中英

在可變參數模板函數中接受int和class?

[英]Accept both int and class in variadic templated function?

這一功能的摔跤模板證明是超出我的。


我想要的是:

一個函數,它生成與以下任何容器中給定的浮點類型相同的浮點類型:

  • vector<ANY_FLOAT_TYPE>
  • array<ANY_FLOAT_TYPE, N>

(當然,我願意讓它接受更多容器!)


問題:

問題在於array <>接受一個整數作為其第二個模板參數,而vector <>接受該位置的分配器。 如何編寫一個可以接受單個參數的類型名和整數的模板化函數? 或者這是繼續編寫此函數的錯誤方法嗎?

我可以復制粘貼並編寫兩次函數,包括vector<> s和array<> s,但這不是解決方案......

 template <typename FT, typename CONT_T, typename... Ts> FT float_sum( CONT_T<FT, Ts...> xs ) { // WARNING: not an accurate summation algorithm! return accumulate( xs.begin(), xs.end(), 0 ); ////////////// static_assert( is_floating_point<FT>::value, "sum() only accepts floating point types." ); } 

只需將整個容器作為模板參數,而不是使用value_type ,它是所有Container類型的接口的一部分。 就像是

template <typename Container>
auto sum(Container const &container)
    -> typename Container::value_type
{
  using value_type = typename Container::value_type;
  static_assert(std::is_floating_point<value_type>::value, 
                "only for floating types");

  return std::accumulate(container.cbegin(), container.cend(), value_type{});
}

此外,如果您決定最終還想使用其他專業化對非浮動類型的容器求和,則可以選擇使用std::enable_if或(通過C ++ 20)概念刪除靜態斷言以支持SFINAE 使用GCC中的概念TS > = 6:

template <typename Container>
auto sum(Container const &container)
requires 
    std::is_floating_point<typename Container::value_type>::value    
{
  using value_type = typename Container::value_type;
  return std::accumulate(container.cbegin(), container.cend(), value_type{});  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM