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
    无法访问私有成员,即使用
    是不可能的
  • 您尝试从上下文绑定
    ,但没有上下文,即没有绑定。您必须传递对象以处理函数参数
  • 您只指定了函数对象的类型,但没有指定实例,即以后将无法使用它
  • 这就是说,您似乎可以只使用自定义函数对象类型的类型,而不是某些lambda函数(当然,这是绝对不固定的,但作为回报,它实际上可以工作):

    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);
    }