簡體   English   中英

從函數的參數中取消容器的類型

[英]Decltype of a container from an argument of a function

我試圖從函數的參數中扣除函數內部的stl容器的類型,它不會編譯:

auto battery_capacity( const vector<double>& v) -> decltype(v)::value_type {
  decltype(v)::value_type b=0;
  return b;
}

錯誤:

main.cpp:10:52: error: 'decltype(v)' (aka 'const vector<double> &') is not a class, namespace, or scoped
      enumeration
auto battery_capacity( const vector<double>& v) -> decltype(v)::value_type {
                                                   ^
main.cpp:11:3: error: 'decltype(v)' (aka 'const vector<double> &') is not a class, namespace, or scoped enumeration
  decltype(v)::value_type b=0;

但是這會編譯:

double battery_capacity( const vector<double>& v) {
  vector<double> s=v;
  decltype(s)::value_type b=0;
  return b;
}

更新(1)

在使用基於Kerrek答案的模板時添加:

template <typename T>
auto battery_capacity( const T& v) -> typename std::remove_reference<decltype(v)>::type::value_type {
  typename std::remove_reference<decltype(v)>::type::value_type b=0;
  return b;
}

如果你真的必須強制使用decltype到這個非常簡單的代碼中(我稱之為誤導),那么就像這樣:

auto battery_capacity(const vector<double> & v) -> std::remove_reference<decltype(v)>::type::value_type
{
    std::remove_reference<decltype(v)>::type::value_type b = 0;
    return b;
}

如果你不確定你為什么要寫這個,你真的不想使用decltype的。 它是一種非常專業的工具,適用於非常專業的通用庫編寫,而不適用於普通家庭用途。

當然,更簡單的答案就是寫下double battery_capacity(...) ,因為你已經知道了類型! (如果您實際上並不知道類型,那么您沒有提出正確的問題,而您的問題並未反映您的實際問題。)

在C ++ 14中,您可以縮短一點:

auto battery_capacity(const vector<double> & v)
{
    return std::remove_reference_t<decltype(v)>::value_type { 0 };
}

暫無
暫無

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

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