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;
}
我在 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;
}