gpt4 book ai didi

c++ - 这些函数为什么不衰减到函数指针?

转载 作者:行者123 更新时间:2023-12-01 15:12:48 24 4
gpt4 key购买 nike

我有一个包含要调用的函数指针的类,现在遇到一种情况,我希望该可调用函数保存一个自包含的引用/值(lambda)。因此,我创建了我的模板化类来接受函数指针或lambda,如下所示:

template <typename FunctionType>
class MyClass
{
public:
MyClass(FunctionType function) : function(function) {}
FunctionType function;
};

但是,似乎每次实例化此类时,编译器都会创建一个不同的“类型”类,如下所示:
int main()
{
MyClass foo([]() {return 5; });
MyClass foo2([]() {return 5; });
MyClass foo3([]() {return 5; }); // ALL THREE OF THESE SEEM TO BE DIFFERENT TYPES
MyClass foo4(static_cast<int(*)()> ([]() {return 5; })); // I THINK I CAN FORCE THEM TO BE THE SAME TYPES BY CASTING
MyClass foo5(static_cast<int(*)()> ([]() {return 5; }));
MyClass foo6(static_cast<int(*)()> ([]() {return 5; }));

std::cout << typeid(foo).name() << '\n';
std::cout << typeid(foo2).name() << '\n';
std::cout << typeid(foo3).name() << '\n';
std::cout << typeid(foo4).name() << '\n';
std::cout << typeid(foo5).name() << '\n';
std::cout << typeid(foo6).name() << '\n';
}

输出是:
class MyClass<class <lambda_e39b14fd1b959adc3c33a259b5258211> >
class MyClass<class <lambda_de164f9f0bca248459ade49332a364c3> >
class MyClass<class <lambda_9fcf071b66983e924cb117ca1e77c4c6> >
class MyClass<int (__cdecl*)(void)>
class MyClass<int (__cdecl*)(void)>
class MyClass<int (__cdecl*)(void)>

由于我将创建成百上千个这样的应用程序,因此我希望尽可能不要出现这种情况。除了偶尔需要的不同的lambda外,传递给我的类的大多数函数应具有相同的类型。那么,每当我传递相同的函数类型时,编译器是否正在创建不同的类型?如果是这样的话,这似乎不是很有效。如果必须这样做,减少编译器创建的类类型数量的最佳方法是什么?我想我是通过在创建类时强制转换为函数指针来实现的,但这似乎是一种糟糕的方法。

最佳答案

您可以使类存储一个函数指针,如下所示:

template <typename Ret, typename ...Args>
class MyClass
{
public:
MyClass(Ret (*function)(Args...)) : function(function) {}
Ret (*function)(Args...);
};

然后,您可以通过将lambda显式衰减到函数指针来存储它:
MyClass foo( + []() {return 5; });

然后每个函数签名仅实例化一个类(无论是lambda还是函数)。

这是 demo

关于c++ - 这些函数为什么不衰减到函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62432999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com