从lambda auto获取模板类型

Æle*_*lex 1 c++ lambda templates

我有点挑剔,跟进我之前的问题并使用类似于我在这里发布的代码.

  1. 我使用variadic模板函数接受可变参数对象
  2. 它将它们打包成一个元组
  3. 用这个visitor成语迭代它们
  4. 为每个对象绑定一个回调

而不是如下所示的原始缩小示例:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图理解如何推断autolambda 的模板类型,以便我可以绑定它:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bar*_*rry 6

只需使用另一个lambda:

auto callback = [&obj](auto& x){
    obj.deserialise(x);
};
Run Code Online (Sandbox Code Playgroud)

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...);
}
Run Code Online (Sandbox Code Playgroud)