簡體   English   中英

如何從指針調用具有 std::variant 返回類型和 arguments 的 function?

[英]How to call a function with std::variant return type and arguments from a pointer?

如何從指針調用具有 std::variant 返回類型和 arguments 的 function(不使用模板)?

例如,如果 function void且沒有 arguments:

void print()
{
    std::cout << "Hello World!" << std::endl;;
}

void run_func(void (*func)())
{
    func();
}

int main()
{
    run_func(print);
}

您還可以使用std::visit ,例如:

auto run_func(std::variant<void (*)(), int (*)(), unsigned int (*)()> variant)
 -> std::variant<std::monostate, int, unsigned int>
{
    using ret_t = std::variant<std::monostate, int, unsigned int>;
    return std::visit([]<class Ret>(Ret (*fptr)()) -> ret_t
    {
        if constexpr (std::is_same_v<void, Ret>)
        {
            fptr();
            return std::monostate{};
        }
        else
        {
            return fptr();
        }
    }, variant);
}

並稱之為:

int get_answer(){return 42;}

// ...

std::visit([](auto i){
        if constexpr(!std::is_same_v<decltype(i), std::monostate>)
            std::cout << i << std::endl;
    }, run_func(&get_answer));

但是如何使用可變數量的 std::variant arguments 來做到這一點,例如:

auto run_func(std::variant<void (*)(std::variant<int, unsigned int>...),
                           int (*)(std::variant<int, unsigned int>...),
                           unsigned int (*)(std::variant<int, unsigned int>...)>
                           variant)

而且我還嘗試使用變體中的許多 c++ std類型來執行此操作(為簡單起見將其排除在外)。

當你寫

auto run_func(std::variant<void (*)(), int (*)(), unsigned int (*)()> variant)
 -> std::variant<std::monostate, int, unsigned int>

您清楚地說明run_func的參數,雖然包裝在一個變體中,但始終是一個空值 function,所以您知道您可以通過()來調用它。 這就是您在編寫fptr()時所做的事情。

在您想要的版本中

auto run_func(std::variant<void (*)(std::variant<int, unsigned int>...),
                           int (*)(std::variant<int, unsigned int>...),
                           unsigned int (*)(std::variant<int, unsigned int>...)>
                           variant)

(順便說一句,我不太確定你的意思是...可變參數語法?或者你只是偽編碼?)輸入到run_funcvariant的每個可能內容都需要 arguments (我的意思是, non void ),因此如果您希望run_func能夠運行包含的任何variant ,則需要以某種方式提供這些 arguments。

換句話說,具有這種簽名的 function 無法將其 arguments 提供給其可調用的 arguments(除了憑空發明一些)。

也許您可以編寫run_func以便它返回 function 您可以稍后將 arguments 傳遞給它? 不過,這看起來很像run_func只是在做展開變體的工作,所以它可能不是你想要的。

有點引用@康桓瑋,關鍵是你想做什么還不清楚。 我們這里有一個XY 問題

暫無
暫無

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

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