创建 std::函数,它返回具有函数成员值的变量.分段错误
Create std::function which returns variant with a value of a function member. Segmentation fault
我正在编写一个包装类来将自定义结构成员变量包装到变体中。 给定对结构对象的引用,std::function 必须返回一个变体,其中包含特定成员的值 - 最初创建 std::function 时。这意味着,我需要在创建函数时保存指向指定类成员的指针。
这段代码可以编译,但是当我尝试调用函数对象时,出现分段错误。为什么会发生这种情况以及如何解决?
#include <functional>
#include <variant>
#include <iostream>
struct Foo
{
int a,
b;
char c;
double d,
e;
};
template <typename Struct, typename ... VarTypes>
struct WrapMemberGet
{
template <typename T>
static std::function<std::variant<VarTypes...>(const Struct&)>
WrapGet(T(Struct::*mem_ptr))
{
return [&](const Struct& s)
{
return std::variant<VarTypes...>(s.*mem_ptr);
};
}
};
int main(int argc, const char **argv)
{
Foo f{4, 8, 15, 16, 23};
auto get_a = WrapMemberGet<Foo, char, int ,double>::WrapGet(&Foo::a);
std::variant<char, int, double> var = get_a(f); // this must hold int = 4
return 0;
}
您的WrapGet
函数按值获取指向成员函数的指针,并且在函数内部捕获该指针作为 lambda 中的引用。这意味着在函数结束后,使用 lambda 中的引用是悬空的,使用它调用 UB。
为了避免它按值捕获它,而是在 lambda 中创建本地副本。
return [=](const Struct& s)
{
return std::variant<VarTypes...>(s.*mem_ptr);
};
通过复制捕获以避免悬而未决的引用:
template <typename T>
static std::function<std::variant<VarTypes...>(const Struct&)>
WrapGet(T(Struct::*mem_ptr))
{
return [=](const Struct& s)
// ^
{
return std::variant<VarTypes...>(s.*mem_ptr);
};
}
相关文章:
- 未使用的C++未优化的静态成员函数/变量
- 内联函数/变量的外部链接
- 同一函数中的静态函数变量初始化顺序
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 如何从doxygen输出中排除类的无证件成员函数/变量
- 如何在LUA C API中分配全局LUA函数变量
- 如何将函数变量传递给C lambda函数
- 通过另一个C++函数更改函数变量
- c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突
- C++:静态成员不能在声明时定义,但静态函数变量可以?
- apache-frift是否支持函数变量作为参数
- 类函数/变量在使用之前必须声明
- 函数变量去哪里
- 无法使用函数变量?错误表达式必须具有类类型
- 如何在main中使用函数变量
- 每当尝试打印函数变量时,C++ cout 错误
- 是否存在查看成员函数/变量的整洁等效项
- 访问友元类之间的函数变量
- 函数到函数变量
- 一个定义规则是否强制创建一个静态函数变量