我有点挑剔,跟进我的previous question并使用类似于我posted here的代码。
visitor
成语而不是下面显示的原始缩小示例:
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)以便以后提取吗?
答案 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...);
}