【发布时间】:2016-08-30 16:35:38
【问题描述】:
我有点麻烦,跟进我的previous question 并使用类似于我posted here 的代码。
- 我使用了一个接受可变参数对象的可变参数模板函数
- 它将它们打包成一个元组
- 使用
visitoridiom 迭代它们 - 为每个对象绑定一个回调
而不是下面显示的原始缩小示例:
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)。