return 与 C++ 中的函数有何不同?

how return different types from function in c++?

我在 C++ 中有一个家庭作业,要为同一向量中的多种数据类型制作 Vector,我卡在需要 return 不同数据类型的地方,我无法更改主要内容.

作业要求使主有效:

int main()
{
    Vector v;
    v.add(5);
    v.add(5.5f);
    v.add("this");
    for (int i = 0; i != v.size(); ++i) { // this code print 5 5.5 this
        std::cout << v.get(i) << "\t";
    }
    std::cout << "Displaying an object of type Vector in different way:\n";
    Integer x;
    x = v.get(0);
    std::cout << x << "\t"; // it prints 5
    Float y;
    y = v.get(1);
    std::cout << y << "\t"; // it prints 5.5
    String z;
    z = v.get(2);
    std::cout << z << "\t"; // it prints this
}

我尝试了我所知道的,我得到了 3 种方法,但仍然没有解决,首先我将所有数据指针设为 char*,并制作了一个字符串类型,用于保存数据和 cout,但它卡在 return 数据类型,我不能使用模板,因为不允许更改 main

int get(int n)
{
    Node* p = head;
    int i;
    for (i = 0; (i < n)&&p->next; i++)
        p = p->next;
    if (i != n)
        return NULL;
    if (p->type != "int")
        return NULL;
    else return *((int*)p->data);
}

我仍然不能仅通过 return 类型重载函数,我试图让 vector 有 3 个指向数据的指针,但我仍然卡住了

int* int_;
float* float_;
string* string_;
Node* next;
string type;
Node(string type_)

上网查了也没找到我想要的,最后尝试做了Node模板 但是由于 get 函数在 vector 上,而 main 没有发送一个类型,这并没有解决问题。

如果我没理解错的话,你要找的是异构容器

您需要创建一个包装器来在您的容器内透明地处理不同的类型。对于您的基础类型,您有多种选择,具体取决于您的需要。

如果您预先知道在编译类型时需要支持的类型列表,您可以使用 std::variant https://en.cppreference.com/w/cpp/utility/variant.

如果您需要支持的类型在编译时是无界的,您可以使用https://en.cppreference.com/w/cpp/utility/any

最后,您可以创建一个通用接口并为您支持的类型实现一个包装器。容器将存储您的对象的智能指针。

更新

  • 删除了基于 C++ 版本的设计决策建议
  • 删除了对 std::vector
  • 的引用

您可能 return 带有转换运算符的包装器,例如:

struct data
{
    int int_ = 0;
    float float_ = 0;
    string string_;

    operator int () const { return int_; }
    operator float () const { return float_; }
    operator std::string () const { return string_; }
};


const Node* get_node(int n) const
{
    Node* p = head;
    int i;
    for (i = 0; (i < n) && p->next; i++)
        p = p->next;
    return p;
}

data get(int n) const
{
    auto* node = get_node(n);
    if (node == nullptr) throw std::out_of_range{};
    return node->data;
}

Demo