gpt4 book ai didi

c++ - 来自函数参数的容器的 decltype

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:15 27 4
gpt4 key购买 nike

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

更新(一)

根据 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(...),因为您已经知道类型了! (如果你实际上不知道类型,那么你没有问正确的问题,你的问题并没有反射(reflect)你的实际问题。)

在 C++14 中,你可以更短一些:

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

关于c++ - 来自函数参数的容器的 decltype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24599894/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com