簡體   English   中英

如何將結構/聯合數組的成員傳遞給函數

[英]How to pass member of structure/union array into function

例如,我只想顯示結構/聯合數組的一個成員的值,所以我想將其作為參數傳遞給一個函數,該函數將僅顯示該成員並顯示我作為參數傳遞的任何其他單個成員。

#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????
}

一種選擇是模板化的成員指針類型 這些通常與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這種方式定義showArr還可以使您傳遞函子,該函子的作用比返回成員要復雜得多,如果需要的話:

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

在C ++ 17中,您應該使用std::variant

using ThreeTypes = std::variant<char, int, double>;

template <std::size_t N>
auto show_arr(std::array<ThreeTypes, N>& arr)
{
    for (auto& e : arr)
    {
        std::visit([](auto e) { std::cout << e << std::endl;}, e);
    }
}

auto test()
{
    std::array<ThreeTypes, 2> arr = {3.4, 'a'};

    show_arr(arr);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM