【发布时间】:2018-03-22 12:52:16
【问题描述】:
我有一个名为 Eclipse 的类,它有一个私有结构成员,其中包含大约 30 个不同数据类型的字段。
我有一个方法可以根据作为参数传入的字段编号从结构中返回数据字段。
鉴于该结构包含各种类型的数据,我选择使用auto 关键字和基于模板化参数的尾随返回类型。我的方法头在下面。
template<typename TheType>
auto getColumnData(TheType toGet, int fieldNum) -> decltype(toGet) {
// switch statement to return fields based on fieldNum
}
如果我想返回 int 的列,我调用 getColumnData(0, 1);。第一个参数仅用于确定方法的返回类型,第二个参数确定返回给方法调用者的字段号。
理论上,这将导致getColumnData() 的返回类型为int 并返回结构的第一列(对应于第一个字段)。但是我收到了这个编译错误:
没有从返回值类型“std::string”(又名“basic_string
, allocator ”)到函数返回类型“decltype(toGet)”(又名“int”)的可行转换')`
我了解,如果我以int 作为第一个参数调用此方法,并使用与返回std::string 的字段相对应的字段编号,则会出现问题。但是,根据其他类的检查,这种情况永远不会发生。
有什么方法可以强制我的编译器接受此代码,即使它在某些情况下可能不正确?
我知道我可以重载该方法,但如果我能弄清楚如何只用一个来完成任务,我宁愿不要有多个不同的方法用于基本相同的目的。
另外,如果我对这些信息的任何理解似乎不正确,请告诉我。我对 C++ 很陌生,所以我只是边学习边学习这些特性。
【问题讨论】:
-
这是完全错误的。如果第一个参数是
int,则decltype指定函数根据定义返回int。句号。故事结局。从那时起,您写的其他所有内容都无关紧要。实例化的模板函数必须返回一个int,没有 ifs、ands 或 buts。
标签: c++ struct types return trailing