【问题标题】:How to change the return type depending on the input C++?如何根据输入 C++ 更改返回类型?
【发布时间】:2019-11-26 07:56:44
【问题描述】:

我将如何编写一个函数以根据输入返回不同的类型。我试过使用模板,但我不确定我是否理解我在做什么。如果输入是 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;
    }

}

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

【问题讨论】:

  • 你打算以后如何使用该功能?意思是即使 C++ 语法允许定义这样的函数,如果你有 int a = functionName(s) 并且函数返回一个字符串会发生什么? C++ 是一种强类型语言,因此这种结构实际上是不可能的。您必须通过使用不同的返回类型多次编写函数来显式避免它,并在输入暗示返回错误类型时处理错误情况。您可以做的另一件事是返回一个结构或只返回一个 std::pair 并且只填充两者之一。
  • 在这种情况下你不能只使用 auto a = functionName(s) 吗?

标签: c++ templates type-conversion


【解决方案1】:

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

您可以使用constexpr if(C++17 起)。

如果值为true,则丢弃statement-false(如果存在),否则丢弃statement-true

废弃语句中的return语句不参与函数返回类型推导

例如

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

    if constexpr (std::is_same_v<T, int>) {
        return std::string("int");
    } else {
        return 0;
    }

}

【讨论】:

  • OP 反问,int -> string,string -> int.
  • 我将不得不查看 constexpr 的文档,但它似乎以我希望的方式运行。除了函数重载的代码简洁之外还有其他好处吗?
【解决方案2】:

使用重载:

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

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

【讨论】:

  • 一旦你编写了重载,你就不再需要模板了
  • @foreknownas_463035818,当然。我只是想与 OP 的函数声明和其他答案保持一致。
  • 但是使用模板只是 OP 解决问题的尝试,它不是必需的。阅读您的答案,他们可能会觉得模板在这里有用,只是说
  • @foreknownas_463035818,已删除模板。
【解决方案3】:

您可以在 C++17 或更高版本中使用 C++17 之前的模板特化或 if 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";
    }
    ....
}

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2018-07-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2019-12-14
    相关资源
    最近更新 更多