Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将指向成员函数的指针作为模板参数传递。为什么这样做有效?_C++_Templates_Boost_Standards - Fatal编程技术网

C++ 将指向成员函数的指针作为模板参数传递。为什么这样做有效?

C++ 将指向成员函数的指针作为模板参数传递。为什么这样做有效?,c++,templates,boost,standards,C++,Templates,Boost,Standards,我有一些100%适用于我的用例的代码。我只是想知道是否有人能解释它是如何工作的以及为什么工作的 我有一个模板类,它位于处理线程和网络通信的代码和库用户之间,用于将从服务器接收到的数据传递给用户 template <class Bar, class Baz, class BazReturnType, void (Bar::*BarSetterFunction)(const BazReturnType &),

我有一些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;
};
模板
福班
{
Foo(Bar*Bar)
:毫巴(巴)
{
}
void FooMemberFunction(常量Baz*Baz)
{
boost::bind(BarSetterFunction,m_-bar,
boost::bind(BazGetterFunction,baz)()();
}
巴*m_巴;
};
根据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 );
typedef Foo
美孚;
MyBar*bar=新的MyBar;
MyBaz*baz=新MyBaz;
MyFoo*f=新的MyFoo(bar);
f->FooMemberFunction(baz);
这一切都是可行的,boost::bind调用getter/setter函数来传递数据像本例中那样,将指针作为模板参数传递给成员函数的方式和原因是什么?



作为对评论的回应,我没有意识到指向成员函数的指针是有效的模板参数。这不是我以前在“野外”见过的东西。我试过了,结果成功了,但我没想到会成功

当你问一个类似于“为什么某些东西能工作?”的问题时,这意味着它能工作的事实在某种程度上让你感到惊讶。要回答这个问题是不可能的,除非你解释为什么你会感到惊讶


为什么有效?因为语言规范明确规定它应该工作。除非你更详细地解释你的担忧,否则没有其他答案。

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

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


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

我不确定我是否完全理解您的要求。指向成员的指针是允许的非类型模板参数类型之一。您只是想在标准中找到这方面的参考吗?14.1/4[temp.param]我猜答案是“因为语言规范这么说”。根据标准,我没有意识到指向成员函数的指针是有效的模板参数。