c++ - 如何将结构/union 数组的成员传递给函数

标签 c++ c++17

例如,我只想显示结构/union 数组的一个成员的值,所以我想将它作为参数传递给一个函数,该函数将只显示该成员,并且还将显示我传递的任何其他单个成员作为论据。

#include <iostream>
using namespace std;

union ThreeTypes
{
    char letter;
    int whole;
    double real;
};

void showArr(ThreeTypes[], int); // ?? What parameters to pass?

int main()
{
    const int SIZE = 50;
    ThreeTypes arr[SIZE];
    for (int i = 0; i < SIZE; i++)
        arr[i].real = 2.37;

    showArr(arr, SIZE, ??? ); // what argument to pass to display member?

    return 0;
}
void showArr(ThreeTypes arr[],int size,???) // also, what parameters??
{
    for (int i = 0; i < size; i++)
        cout << arr[i].?? << endl; // member from argument????
}

最佳答案

一个选项是模板化 pointer-to-member type .这些通常用于 classstruct 类型,但也适用于 union 类型。指向成员类型的指针声明为 MemberType ClassType::*pointer_name,这样的指针的名称可以用在 .*->* 运算符。

template <typename T>
void showArr(const ThreeTypes arr[], int size, T ThreeTypes::*ptr)
{
    for (int i = 0; i < size; ++i)
        std::cout << (arr[i].*ptr) << std::endl;
}

然后您使用语法 &ClassType::member_name 创建一个指向成员值的指针:

int main()
{
    const int SIZE = 50;
    ThreeTypes arr[SIZE];
    for (int i = 0; i < SIZE; i++)
        arr[i].real = 2.37;

    showArr(arr, SIZE, &ThreeTypes::real);
}

另一个更通用的选择是采用可调用仿函数:

template <typename F>
void showArr(const ThreeTypes arr[], int size, const F& func)
{
    for (int i = 0; i < size; ++i)
        std::cout << func(arr[i]) << std::endl;
}

您可以使用 lambda 或 std::mem_fn 创建仿函数来访问成员:

void print_reals_twice(const ThreeTypes arr[], int size)
{
    showArr(arr, size, [](const ThreeTypes& u) { return u.real; });
    // Same effects:
    showArr(arr, size, std::mem_fn(&ThreeTypes::real));
}

但如果您愿意,以这种方式定义 showArr 还可以让您传递一个仿函数,它可以做比返回成员更复杂的事情:

void print_sin2x_all(const ThreeTypes arr[], int size)
{
    showArr(arr, size, [](const ThreeTypes& u) { return std::sin(2*u.real); });
}

关于c++ - 如何将结构/union 数组的成员传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52567081/

相关文章:

c++ - 从 std::apply 中的折叠表达式捕获返回值

c++ - 我可以使用结构化绑定(bind)和 for-each 循环来迭代几个 “packed-together” 值吗?

c++ - 将整数常量映射到类型

c++ - vector 的交集

c++ - wxWidgets 中的可切换菜单栏(何时隐藏?)

c++ - 获取模板函数返回类型的函数第一个参数的类型

c++ - 是否有构造函数/析构函数方法的总称?

c++ - 改进折叠功能

c++ - 在 windows 中以 1ms 的精度找出时间的最快方法是什么?

c++ - C++11 之前的可变参数模板