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