C++ lambda作为模板参数,可访问';这';指针?
我必须创建三个四个类的对象,所有这些对象都继承自一个基类,但其中一些对象需要有不同的行为——比如一个函数的完全更改;我可以通过更多的继承和多态性来做到这一点,但这似乎不是一个好主意。C++ lambda作为模板参数,可访问';这';指针?,c++,templates,c++11,lambda,C++,Templates,C++11,Lambda,我必须创建三个四个类的对象,所有这些对象都继承自一个基类,但其中一些对象需要有不同的行为——比如一个函数的完全更改;我可以通过更多的继承和多态性来做到这一点,但这似乎不是一个好主意。 我的第一个解决方案是使用专门的模板(对于每一个非标准的情况),但随后我考虑将lambda作为模板参数(如此处:),并使用它们代替类方法(如此处:)-对我来说,这是更好的解决方案,因为我只需要在每一个奇怪的情况下传递lambda: auto-default_lambda=[&]()->int{returnthis->
我的第一个解决方案是使用专门的模板(对于每一个非标准的情况),但随后我考虑将lambda作为模板参数(如此处:),并使用它们代替类方法(如此处:)-对我来说,这是更好的解决方案,因为我只需要在每一个奇怪的情况下传递lambda:
auto-default_lambda=[&]()->int{returnthis->Sth;};
模板
上课{
...
问题在于我想要更改的指针方法需要访问非静态方法,而lambda是在非静态方法之外定义的。此外,我不能将类的引用传递给lambda,因为它是一个模板类(或者可能我错了?)。当然,我可以使用专门的模板或函数指针,但我确实喜欢用lambda来解决问题,我认为它比我的其他想法要好得多。
有没有办法“避免”这个问题?或者我的想法一直都不好?你的方法至少有三个明显的问题:
SomeClass
无法访问私有成员,即使用此
是不可能的此
,但没有上下文,即没有绑定。您必须传递对象以处理函数参数struct default\u lambda{
模板
int运算符()(T常量&o)常量{return o.x();}
};
模板
上课{
...
};
如果您需要完全更改一个功能,您有两种选择:
- 一个虚拟函数,如果您有许多这样的对象,并且不想创建许多命名空间作用域类型,则可能使用本地类+类型擦除:
,如果您愿意,可以稍后重新启动std::function
std::unique_ptr get_an_object()
{
类impl:public my_base2
{
void my_virtual_function(){blah blah;}
};
返回std::unique_ptr(新impl);
}
在这种情况下,两者通常都优于模板(但如果没有上下文,则很难说)。请发布您试图解决的实际问题(最小、完整、具有代表性的示例)。也许可以使用成员指针解决这一问题。。。“我可以通过更多的继承和多态性来做到这一点,但这似乎不是一个好主意。”为什么不呢?这就是多态性的目的。我在这里支持@Nicolas。不幸的是,人们往往对多态性不屑一顾,好像它已经过时了。在我看来,你可以使用任何一个虚拟函数来解决你的问题(这就是它们的用途!)2)
std::function
,因为您可能希望在构造时绑定函数(如果您选择1,本地类可能会有所帮助)
struct default_lambda {
template <typename T>
int operator()(T const& o) const { return o.x(); }
};
template <typename F = default_lambda>
class SomeClass {
...
};
std::unique_ptr<my_base2> get_an_object()
{
class impl : public my_base2
{
void my_virtual_function() { blah blah; }
};
return std::unique_ptr<my_base2>(new impl);
}