C++ 如何根据输入C++;?

C++ 如何根据输入C++;?,c++,templates,type-conversion,C++,Templates,Type Conversion,我如何编写一个函数来根据输入返回不同的类型呢。我尝试过使用模板,但我不确定我是否理解我在做什么。如果输入是int,我希望输出是字符串,反之亦然 所以我试过这样的方法: using namespace std; template <class T> T functionName(T s){ if(typeid(s).name() == 'i'){ return "int"; } if(typeid(s).name() == 's'){

我如何编写一个函数来根据输入返回不同的类型呢。我尝试过使用模板,但我不确定我是否理解我在做什么。如果输入是int,我希望输出是字符串,反之亦然

所以我试过这样的方法:

using namespace std;

template <class T>
T functionName(T s){

    if(typeid(s).name() == 'i'){
        return "int";
    }
    if(typeid(s).name() == 's'){
        return 0;
    }

}
使用名称空间std;
模板
T函数名(TS){
if(typeid.name()=='i'){
返回“int”;
}
if(typeid.name()='s'){
返回0;
}
}

不知道如何实现我在这里寻找的目标。任何指导都将不胜感激。

问题是必须在编译时确定唯一的返回类型;不能有多个返回语句返回不相关的类型

您可以使用(从C++17开始)

如果值为
true
,则放弃语句false(如果存在),否则放弃语句true

丢弃语句中的返回语句不参与函数返回类型推断

e、 g

模板
自动函数名(TS){
如果constexpr(std::is_same_v){
返回标准::字符串(“int”);
}否则{
返回0;
}
}
使用重载:

const char* foo(int) {
    return "int";
}

int foo(const char*) {
    return 0;
}

您可以在C++17之前使用模板专门化,或者在C++17及更高版本中使用constexpr时使用模板专门化

template <class U, class T>
U functionName(T s);
template <>
std::string functionName(int s){
    return "int";
}
template <>
int functionName(std::string s){
    return 0;
}
// Or
template <class T>
auto functionName(T s){
    if constexpr (std::is_same_v<T, std::string>) {
        return 0;
    } else if constexpr (std::is_same_v<T, int>) {
        return "int";
    }
    ....
}
模板
U函数名(ts);
模板
std::字符串函数名(int s){
返回“int”;
}
模板
int函数名(std::string s){
返回0;
}
//或
模板
自动函数名(TS){
如果constexpr(std::is_same_v){
返回0;
}否则,如果constexpr(std::is_same_v){
返回“int”;
}
....
}

OP,int->string,string->int。我必须查看constexpr的文档,但它似乎以我希望的方式运行。除了代码的简洁性,函数重载还有其他好处吗?一旦编写了重载,就不需要模板了anymore@formerlyknownas_463035818当然我只是想与OP的函数声明和其他答案保持一致。但使用模板只是OPs解决问题的一种尝试,不是一种要求。阅读你的答案,他们可能会觉得模板在这里是有用的,只是saying@formerlyknownas_463035818,已删除模板。以后您打算如何使用该功能?即使C++语法允许定义这样的函数,如果你有int A=函数名,函数返回一个字符串,那么会发生什么?C++是一种强类型语言,因此这种结构是不可能的。您必须使用不同的返回类型多次编写函数,并在输入意味着返回错误的类型时处理错误情况,从而明确地避免这种情况。另一种方法是返回一个struct或std::pair,并只填充其中一个。在这种情况下,不能只使用auto a=functionName吗?
template <class U, class T>
U functionName(T s);
template <>
std::string functionName(int s){
    return "int";
}
template <>
int functionName(std::string s){
    return 0;
}
// Or
template <class T>
auto functionName(T s){
    if constexpr (std::is_same_v<T, std::string>) {
        return 0;
    } else if constexpr (std::is_same_v<T, int>) {
        return "int";
    }
    ....
}