【问题标题】:C++ pointer to template function which class memberC++ 指向模板函数哪个类成员的指针
【发布时间】:2011-11-16 14:02:04
【问题描述】:

我在“C”类中有以下函数

class C
{
  template<typename T> void Func1(int x);
  template<typename T> void Func2(int x);
};

template<typename T> void C::Func1(int x)
{
  T a(x);
}

template<typename T> void C::Func2(int x)
{
  T a(x);
}

函数仅在实现中使用模板。签名不包含模板参数。

是否可以定义指向此类模板函数的指针?

我尝试了以下定义,但它导致编译错误。

typedef template&lt;typename T&gt; void (СSomeClass::*TFuncPtr)(int);

【问题讨论】:

  • 没有 typedef 是否可以工作?
  • 停止调用它们模板函数。它们是函数模板。它确实有所作为(不,我不愿意向不接受答案的人解释)。
  • Jan 非常感谢您的回答,真的很有用。

标签: c++ templates function pointers


【解决方案1】:

一旦实例化,成员函数模板就只是一个普通的成员函数,所以你可以使用普通的成员函数指针(最好typedef'd like below):

typedef void (C::*mem_fun_ptr)(int);
mem_fun_ptr p = &C::Func1<Bar>;
//          IMPORTANT -- ^^^^^

下划线部分是重要部分。不能创建指向函数模板的指针,但可以创建指向实例化函数模板的指针。

【讨论】:

    【解决方案2】:

    你只想要一个指向函数的指针吗? 很简单:

    class C
    {
    public:
      template<typename T> void Func1(int x);
    };
    
    typedef void (C::*TFuncPtr)(int);
    
    int main()
    {
     TFuncPtr ptr = &C::Func1<int>;
    }
    

    如果你想要别的东西,你能举一个使用你想要的指针的例子吗?

    【讨论】:

    • 你的回答完全符合我的问题。谢谢。
    • stackoverflow.com/faq#howtoask 阅读有关接受答案的部分:“当您确定哪个答案对您最有帮助时,请单击左侧的复选框轮廓将其标记为已接受的答案回答。”
    • 如果我有一个返回值作为模板,我将如何处理它?
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多