从lambda auto获取模板类型

时间:2016-08-30 16:35:38

标签: c++ templates lambda

我有点挑剔,跟进我的previous question并使用类似于我posted here的代码。

  1. 我使用variadic模板函数接受可变参数
  2. 将它们打包成元组
  3. 使用visitor成语
  4. 对它们进行迭代
  5. 为每个对象绑定一个回调
  6. 而不是下面显示的原始缩小示例:

    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 lambda的模板类型,以便我可以绑定它:

    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);
        }
    }
    

    有一个问题:参数对象是不可复制的(尽管我可以改变它),但我想通过推断包含在元组中的模板类型来获知上述是否/如何工作。访客。

    如果我不能推断出lambda中的类型,我可以以某种方式存储在元组中(例如:type&amp; object)以便以后提取吗?

1 个答案:

答案 0 :(得分: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...);
}