第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

“解壓縮”元組以調(diào)用匹配的函數(shù)指針

“解壓縮”元組以調(diào)用匹配的函數(shù)指針

C++ C
Qyouu 2019-06-03 17:03:05
“解壓縮”元組以調(diào)用匹配的函數(shù)指針我試著儲(chǔ)存在std::tuple不同數(shù)量的值,這些值稍后將用作調(diào)用與存儲(chǔ)類型匹配的函數(shù)指針的參數(shù)。我創(chuàng)建了一個(gè)簡單的示例,展示了我正在努力解決的問題:#include <iostream>#include <tuple>void f(int a, double b, void* c) {   std::cout << a << ":" << b << ":" << c << std::endl;}template <typename ...Args>struct save_it_for_later {   std::tuple<Args...> params;   void (*func)(Args...);   void delayed_dispatch() {      // How can I "unpack" params to call func?      func(std::get<0>(params), std::get<1>(params), std::get<2>(params));      // But I *really* don't want to write 20 versions of dispatch so I'd rather       // write something like:      func(params...); // Not legal   }};int main() {   int a=666;   double b = -1.234;   void *c = NULL;   save_it_for_later<int,double,void*> saved = {                                  std::tuple<int,double,void*>(a,b,c), f};   saved.delayed_dispatch();}正常情況下涉及的問題std::tuple或者是各種模板,我會(huì)編寫另一個(gè)模板,如template <typename Head, typename ...Tail>一個(gè)地遞歸地計(jì)算所有類型,但是我看不出有什么方法來分配函數(shù)調(diào)用。這樣做的真正動(dòng)機(jī)要復(fù)雜一些,而且基本上只是一個(gè)學(xué)習(xí)練習(xí)。您可以假設(shè)我是從另一個(gè)接口通過契約傳遞元組的,所以不能更改,但是將其解壓縮到函數(shù)調(diào)用中的愿望是我的愿望。這排除了使用std::bind作為規(guī)避潛在問題的廉價(jià)方法。使用std::tuple,還是另一種更好的方法來實(shí)現(xiàn)相同的凈結(jié)果:存儲(chǔ)/轉(zhuǎn)發(fā)一些值和一個(gè)函數(shù)指針,直到一個(gè)任意的未來點(diǎn)?
查看完整描述

3 回答

?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊

您需要構(gòu)建一個(gè)數(shù)字參數(shù)包并解壓它們。

template<int ...>struct seq { };template<int N, int ...S>struct gens : gens<N-1, N-1, S...> { };template<int ...S>struct gens<0, S...> {
  typedef seq<S...> type;};// ...
  void delayed_dispatch() {
     callFunc(typename gens<sizeof...(Args)>::type());
  }

  template<int ...S>
  void callFunc(seq<S...>) {
     func(std::get<S>(params) ...);
  }// ...


查看完整回答
反對 回復(fù) 2019-06-03
?
守著星空守著你

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個(gè)贊

這里是一個(gè)C+14解決方案。

template <typename ...Args>struct save_it_for_later{
  std::tuple<Args...> params;
  void (*func)(Args...);

  template<std::size_t ...I>
  void call_func(std::index_sequence<I...>)
  { func(std::get<I>(params)...); }
  void delayed_dispatch()
  { call_func(std::index_sequence_for<Args...>{}); }};

這仍然需要一個(gè)助手函數(shù)(call_func)。由于這是一個(gè)常見的成語,也許標(biāo)準(zhǔn)應(yīng)該直接支持它std::call可能的實(shí)施

// helper classtemplate<typename R, template<typename...> class Params, typename... Args, std::size_t... I
>R call_helper(std::function<R(Args...)> const&func, Params<Args...> const&params, std::index_sequence<I...>)
{ return func(std::get<I>(params)...); }// "return func(params...)"template<typename R, template<typename...
> class Params, typename... Args>R call(std::function<R(Args...)> const&func, Params<Args...> const&params)
{ return call_helper(func,params,std::index_sequence_for<Args...>{}); }

那么我們的延遲調(diào)度就變成了

template <typename ...Args>struct save_it_for_later{
  std::tuple<Args...> params;
  std::function<void(Args...)> func;
  void delayed_dispatch()
  { std::call(func,params); }};


查看完整回答
反對 回復(fù) 2019-06-03
  • 3 回答
  • 0 關(guān)注
  • 532 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)