【发布时间】:2020-10-07 12:11:43
【问题描述】:
我有一个类,其中包含一个要调用的函数指针,现在我遇到了一种情况,我希望该可调用函数包含一个自包含的引用/值 (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。那么每次我传递相同的函数类型时编译器都会创建不同的类型吗?如果是这样的话,它似乎效率不高。如果必须是这种情况,那么减少编译器创建的类类型数量的最佳方法是什么?我想我是通过在创建类时强制转换为函数指针来实现的,但这似乎是一种糟糕的做法。
【问题讨论】:
-
问题是关于衰减/使用还是关于不同类型(以及可能减少此类)?帖子的正文似乎偏离了标题。
-
其实要求每个lambda都是自己唯一的匿名类。
-
It doesn't seem very efficient if that's the case.不同类型并不一定意味着编译器会为其创建不同的代码。 -
你是不是故意避开
std::function<int()>? -
请注意,使用
std::function,您的MyClass甚至不需要是模板。
标签: c++ templates lambda closures