2016-08-30 74 views
1

我在一個泡菜,跟進我的previous question和使用類似的代碼我posted here從lambda自動獲取模板類型

  1. 我用它接受可變參數對象可變參數模板功能
  2. 它把它們打包成一個元組他們使用visitor成語
  3. 綁定每個對象的回調

相反

  • 迭代的原始縮小示例如下所示:

    template <typename... Args> 
    void make_classes(Args... args) 
    { 
        auto t = std::tuple<Args...>(args...); 
        unsigned int size = std::tuple_size<decltype(t)>::value; 
        auto execute = [](auto & obj){ obj.operator()(); }; 
    
        for (int i = 0; i < size; i++) { 
         visit_at(t, i, execute); 
        } 
    } 
    

    我想明白,我怎麼能演繹出auto拉姆達的模板類型,這樣我就可以將其綁定:

    template <typename... Args> 
    void make_classes(Args... args) 
    { 
        auto t = std::tuple<Args...>(args...); 
        unsigned int size = std::tuple_size<decltype(t)>::value; 
        auto execute = [](auto & obj){ 
         // obtain type of obj as T? 
         auto callback = std::bind(&T::deserialise, obj, std::placeholders::_1); 
         // do something else here using this callback. 
        }; 
    
        for (int i = 0; i < size; i++) { 
         visit_at(t, i, execute); 
        } 
    } 
    

    這裏有一個問題:參數對象是不可複製的(雖然我可以改變),但我想知道是否/如何通過推斷訪問者獲取的元組中包裝的模板類型來實現上述功能。

    如果我不能推斷類型拉姆達內,我可以採用某種商店它元組內(例如,:類型&對象),以便以後提取它?

  • +0

    你不需要'decltype (自動)'? – NathanOliver

    +0

    @NathanOliver我不知道,那會如何工作? –

    +0

    @NathanOliver似乎是你的東西,使用'decltype(obj'返回錯誤:類型'decltype(obj)'不能在'::'之前使用,因爲它沒有成員'打印在正確的類型錯誤 –

    回答

    6

    只需使用另一個lambda:

    auto callback = [&obj](auto& x){ 
        obj.deserialise(x); 
    }; 
    

    std::bind很少有用。 (如果你真的想複製obj,你可以刪除領先&。)


    而且,你實際上並不需要一個元組...

    template <class F, class... Args> 
    void for_each_arg(F&& f, Args&&... args) { 
        using swallow = int[]; 
        (void)swallow{0, 
         (void(f(std::forward<Args>(args))), 0)... 
        }; 
    } 
    
    template <typename... Args> 
    void make_classes(Args... args) 
    { 
        for_each_arg([](auto& obj){ 
         auto callback = [&obj](auto& x) { obj.deserialise(x); }; 
         // do something with callback 
        }, args...); 
    } 
    
    +0

    很多謝謝,這樣會簡單很多,需要一些時間來消化。 –

    +1

    @ TC的答案](http://stackoverflow.com/a/30563282/2069064)一個很好的解釋。 – Barry