c++ - 将指向成员函数的指针作为模板参数传递。为什么这行得通?

标签 c++ templates boost standards

我有一些代码 100% 适用于我的用例。我只是想知道是否有人可以解释它的工作原理和原因。

我有一个模板类,它位于处理线程和网络通信的一些代码与库用户之间,用于将从服务器接收到的数据传递给用户。

template <class Bar,
          class Baz,
          class BazReturnType,
          void (Bar::*BarSetterFunction)(const BazReturnType &),
          BazReturnType (Baz::*BazGetterFunction)(void) const>
class Foo
{
    Foo( Bar *bar )
        : m_bar(bar)
    {
    }

    void FooMemberFunction( const Baz *baz )
    {
        boost::bind( BarSetterFunction, m_bar,
                     boost::bind( BazGetterFunction, baz )() ) ();
    }

    Bar *m_bar;
};

这个模板根据 Bar 和 Baz 的类型被实例化并在库中使用,如下所示:

typedef Foo<MyBar,
            MyBaz,
            ReturnTypeFromBazGetterFunction,
            &MyBar::ActualSetterFunction,
            &MyBaz::ActualGetterFunction >
    MyFoo;

MyBar *bar = new MyBar;
MyBaz *baz = new MyBaz;
MyFoo *f = new MyFoo( bar );
f->FooMemberFunction( baz );

这一切都有效,boost::bind 调用 getter/setter 函数将数据传递到需要去的地方。 在这种情况下如何以及为什么将指向成员函数的指针作为模板参数传递?


在回复评论时,我没有意识到指向成员函数的指针是有效的模板参数。这不是我以前在“野外”见过的东西。我试过了,它奏效了,但我没想到会这样。

最佳答案

我认为有一个比“因为标准这么说”更好的解释为什么可以这样做:

它起作用的原因是因为指向成员的指针是编译时已知的常量值(指向成员的指针实际上是成员相对于类开头的偏移量)。因此,它们可以用作模板的参数,就像任何其他整数常量一样。

另一方面,普通指针不是编译时常量,因为它们依赖于只存在于运行时的内存布局。它们不能是模板参数。

关于c++ - 将指向成员函数的指针作为模板参数传递。为什么这行得通?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1882740/

相关文章:

c++ - 编译.h文件

c++ - 序列化模板化子类

c++ - 如何获取字符串的所有 1 位或相邻的 2 位数字组合

c++ - 为什么这个名字有歧义?

c++ - C++ 11 auto关键字多少太多了?

c++ - 将文件读入结构时出现问题

c++ - 根据某些元数据在运行时转换参数包值

c++ - 具有类似参数的C++函数的重载

c++ - 为什么 boost::asio::async_read 无法读取请求的字节数?

python - 我可以在没有 bjam 的情况下编译 boost.python 模块吗?