我想创建一个函数,为不同的输入字符串返回不同类型的数据类型。我正在使用模板,但似乎我犯了一些错误。
template<typename S>
S select(string type){
int integer;
float floaty;
char character;
string strings;
if(type=="int")
return integer;
if(type=="char")
return character;
if(type=="float")
return floaty;
if(type=="string")
return strings;
}
当我运行它时会出现这个错误,这将是字符串参数int。
sam.cpp:771:13: error: no matching function for call to ‘select(std::string&)’
select(type);
^
sam.cpp:771:13: note: candidates are:
In file included from /usr/include/x86_64-linux-gnu/sys/types.h:219:0,
from /usr/include/stdlib.h:314,
from Markup.h:12,
from sam.cpp:3:
/usr/include/x86_64-linux-gnu/sys/select.h:106:12: note: int select(int, fd_set*, fd_set*, fd_set*, timeval*)
extern int select (int __nfds, fd_set *__restrict __readfds,
^
/usr/include/x86_64-linux-gnu/sys/select.h:106:12: note: candidate expects 5 arguments, 1 provided
sam.cpp:17:3: note: template<class S> S select(std::string)
S select(string type){
^
sam.cpp:17:3: note: template argument deduction/substitution failed:
sam.cpp:771:13: note: couldn't deduce template parameter ‘S’
select(type);
如果这是错误的方式并且有更好的做事方式,那就分享吧,谢谢。
答案 0 :(得分:3)
在C ++模板中,类型推导是基于参数而不是返回类型,因此,在您的特定情况下,当您调用函数select时,您必须显式指定模板参数。
那么我将如何实现我想用这个功能做什么呢?
使用模板专业化。
template<typename S>
S select(){
static_assert("Not Implemented");
}
template<> int select<int>() {
int integer;
//To Do
return integer;
}
template<> float select<float >() {
float floaty;
//To Do
return floaty;
}
//Remaining Specialization
并使用显式模板参数
调用相应的专门化int main()
{
int _integer = select<int>();
float _float = select<float>();
..........
}
答案 1 :(得分:0)
这不可行。模板需要在编译时知道它们的参数,但type
的值仅在运行时已知。
如果S
为int
,则return strings
无法编译,但如果S
为string
,则return integer
赢了&#39 ; t编译。
正如其他人指出的那样S
无法推断出来,所以你必须在调用中明确指定它。但由于上述原因,它仍无法发挥作用。
(除此之外,你还没有初始化任何值。)