![](/img/trans.png)
[英]How to call a function from a std::variant of different return type function pointers?
[英]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_func
的variant
的每個可能內容都需要 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.