gpt4 book ai didi

c++ - std::function 和类继承

转载 作者:行者123 更新时间:2023-11-30 03:25:46 30 4
gpt4 key购买 nike

我试图了解如何 std::function工作并创建了一个简单的例子:

#include <iostream>
#include <functional>
#include <string>

using namespace std::placeholders; // _1, _2, _3...

class holder
{
public:
using fn_decoder = std::function< int ( uint8_t input, int event ) >;
using raw_fn_decoder = int ( holder::* )( uint8_t input, int event );

fn_decoder _fn_decoder;

holder( )
: holder( std::bind( &holder::decode, this, _1, _2 ) )
{}
holder( raw_fn_decoder dec )
: _fn_decoder( std::bind( dec, this, _1, _2 ) )
{}
holder( fn_decoder dec )
: _fn_decoder( dec )
{}

virtual int decode( uint8_t input, int event )
{
std::cout << "[" << __PRETTY_FUNCTION__ << "] '" << input << "', " << ( unsigned )event << std::endl;
return event;
}

int operator( )( uint8_t input, int event )
{ return _fn_decoder( input, event ); }
};

int decode( uint8_t input, int event )
{
std::cout << "[" << __PRETTY_FUNCTION__ << "] '" << input << "', " << ( unsigned )event << std::endl;
return event;
}

int main( )
{
holder h0;
h0( 'A', 1 );
h0._fn_decoder = std::bind( &decode, _1, _2 );
h0( 'C', 3 );
}

如预期的那样输出:

[virtual int holder::decode(uint8_t, int)] 65, 1
[int decode(uint8_t, int)] 67, 3

然后,我的下一步是添加一个派生类:

class new_holder
: public holder
{
public:
new_holder( )
: holder( static_cast< raw_fn_decoder >( &new_holder::decode ) )
{}

int decode( uint8_t input, int event )
{
std::cout << "[" << __PRETTY_FUNCTION__ << "] '" << input << "', " << ( unsigned )event << std::endl;
return event;
}
};

然后我将这行添加到 main() :

new_holder  h1;

h1( 'E', 5 );
h1._fn_decoder = std::bind( &holder::decode, &h1, _1, _2 );
h1( 'F', 6 );
h1._fn_decoder = std::bind( &decode, _1, _2 );
h1( 'G', 7 );

h0._fn_decoder = std::bind( &new_holder::decode, &h1, _1, _2 );
h0( 'B', 2 );

输出:

[virtual int holder::decode(uint8_t, int)] 'A', 1        // As before.
[int decode(uint8_t, int)] 'C', 3 // As before.
[virtual int new_holder::decode(uint8_t, int)] 'E', 5 // As expected.
[virtual int new_holder::decode(uint8_t, int)] 'F', 6 // Shouldn't be holder::decode?
[int decode(uint8_t, int)] 'G', 7 // As expected.
[virtual int new_holder::decode(uint8_t, int)] 'B', 2 // Well, it is weird, but I asked for.

我无法理解“F”行。我想我应该能够构建一个 std::function来自 holder::decode因为它是在 h0 中完成的施工。

这是一个实时运行的例子,供任何愿意尝试的人使用:


如果我尝试子类化 new_holder,事情会变得更糟或导出 another_holder来自 holder但我认为如果我在这里全部包含它会变得太冗长。


提前致谢

最佳答案

&new_holder::decode&holder::decode 是虚成员函数指针。

它们是指向“虚函数表”的“指针”,而不是指向实际函数的指针。

当您使用它们调用时,您进行了虚拟分派(dispatch)。

除此之外你所做的一切都是噪音。

没有直接的语法来获取指向虚函数特定实现的指针。你可以靠近:

[](auto* self, auto&&...args)->decltype(auto) {
return self->FIXED_TYPE::SomeMethod( decltype(args)(args)... );
}

如果你想要 ->* 语法,你必须重载运算符等,但这可以传递给 std::function 并且它会“做正确的事情”并调用特定的重载而不是进行重载解析。

关于c++ - std::function 和类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48814540/

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