C ++:将未知的union传递给函数作为参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++:将未知的union传递给函数作为参数相关的知识,希望对你有一定的参考价值。

所以我有这样的事情:

struct FoodType {
    union {
        int fat = 2;
    } Apple;
    union {
        int fat = 3;
    } Banana;
} FoodType;

我想编写一个以“未知”FoodType作为参数的函数。

void eatFood(FoodType type) { /* do something */ }

如何实施?

答案

您在问题中提供的枚举解决方案的替代方法是实例化:

#include <iostream>

struct FoodType {
    FoodType(int f) : fat(f) {}
    int getFat() { return fat; }
    int fat;
};

void eatFood(const FoodType& type) { std::cout << "I ate " << type.getFat() << " grams of fat
"; }

int main() {
    FoodType apple(2);
    eatFood(apple);
    FoodType banana(3);
    eatFood(banana);
}

或者,对于更复杂的情况,可以使用多态,但在这里似乎有点矫枉过正:

#include <iostream>

struct FoodType {
    virtual int getFat() const = 0;
};

struct Apple: FoodType {
    int getFat() const { return 2; }
};

struct Banana: FoodType {
    int getFat() const { return 3; }
};

void eatFood(const FoodType& type) { std::cout << "I ate " << type.getFat() << " grams of fat
"; }

int main() {
    Apple apple;
    eatFood(apple);
    Banana banana;
    eatFood(banana);
}
另一答案

这就是你要追求的吗?

struct Food {
  enum class Type { Apple, Banana };
  int fat = 2;
  Type type = Apple;
};

您可以在此处指定类型,也可以存储fat值。

在问题的代码中,有一个union与一个成员。 union需要多个成员才有用,成员存储在相同的内存地址中,因此您当时只能使用其中一个成员。两个工会都声明了一个具有相同名称和功能的变量,在我看来,你只需要其中一个。

但是,如果你有一些更复杂的想法,并且你真的需要一个union,那么你应该尝试这样的事情:

struct Food {
  enum class Type { Apple, Banana };
  Type type = Apple;
  union {
    int banana;
    double apple;
  };
};
Food food;
food.type = Food::Type::Apple;
food.apple = 2;

在这里,你可以使用banana元素或apple元素,你可以使用type元素来知道使用哪一个。

但是如果你需要它,如果你的编译器还不支持它,你最好使用新的std::variant(或boost :: variant)。

另一答案

从你的评论来看,你想要枚举。 C ++有枚举:

enum FoodType
{
    Apple,
    Banana
};

void EatFood(const FoodType & foodType)
{
    switch (foodType)
    {
    case Apple:
        /* do something */
        break;
    case Banana:
        /* do something */
        break;
    default:
        /* handle invalid value */
        break;
    }
}

如果需要这些整数值,请执行以下操作:

enum FoodType
{
    Apple=2,
    Banana=3
};

如果您想要严格打字,请执行以下操作:

enum class FoodType
{
    Apple=2,
    Banana=3
};

(然后在EatFood中你必须使用FoodType :: Apple和FoodType :: Banana。)

以上是关于C ++:将未知的union传递给函数作为参数的主要内容,如果未能解决你的问题,请参考以下文章

R将分组列作为字符串传递给函数参数汇总。

将 C 函数和参数作为右值引用传递

C ++编译器能否优化使用用于将函数结果传递给另一个函数的虚拟变量?

C ++ lambda作为函数的模板参数不起作用

急:VC6编写DLL里,怎么给函数传递字符串类型的参数

仅将一些参数作为 R 中的命名列表传递给函数