从函数的参数中取消容器的类型

时间:2014-07-06 20:11:24

标签: c++ c++11 decltype

我试图从函数的参数中扣除函数内部的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;
}

1 个答案:

答案 0 :(得分:10)

如果你真的必须强迫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 };
}
相关问题