【问题标题】:getting template type from lambda auto从 lambda auto 获取模板类型
【发布时间】:2016-08-30 16:35:38
【问题描述】:

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

  1. 我使用了一个接受可变参数对象的可变参数模板函数
  2. 它将它们打包成一个元组
  3. 使用visitor idiom 迭代它们
  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);
    }
}

我正在尝试了解如何推断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 中的类型,我能否以某种方式将其存储在元组中(例如:类型和对象)以便以后提取它?

【问题讨论】:

  • 你不需要decltype(auto)吗?
  • @NathanOliver 我不知道,这将如何工作?
  • @NathanOliver 似乎你正在做某事,使用 decltype(obj 返回 error: type 'decltype(obj)' cannot be used prior to '::' because it has no members 并在错误中打印正确的类型。
  • 糟糕。错字。如果您想要obj 的类型,那么您只需使用decltype(obj)

标签: c++ templates lambda


【解决方案1】:

只需使用另一个 lambda:

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

std::bind 很少有用。 (如果真的要复制obj,可以把前面的&amp;去掉。)


此外,您实际上并不需要元组...

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

【讨论】:

  • 哇,非常感谢,这更简单,需要一些时间来消化。
  • @Ælex 请参阅T.C.'s answer 以获得很好的解释。
猜你喜欢
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
相关资源
最近更新 更多