【问题标题】:Template class function pointer type alias模板类函数指针类型别名
【发布时间】:2018-12-04 13:33:33
【问题描述】:

我正在尝试为 myClass 中的函数 (myFunction) 创建类型别名。

template<typename T>
using calc_t = matrix<T> (MyClass<T>::*myFunction)(const matrix<T> &X);

我会得到一个通用语法错误,missing ')' before MyClass&lt;T&gt;::*myFunction

然后就这样使用它

calc_t<double> fptr = &MyClass<double>::myFunction;

我不确定在这种特定情况下使用 using 类型别名而不是非模板类型定义时使用的语法。

我查看了以下似乎未涵盖此特定用法的其他 SO 问题:

我尝试了其他一些变体,但没有成功。

【问题讨论】:

  • 您是否收到错误消息?错误是什么?带有类定义的minimal reproducible example 会很有用。
  • 我真的不建议使用指向成员函数的指针(或指向 any 函数的指针)。相反,我建议使用更通用的std::function
  • @clcto 我已经添加了在这种情况下遇到的错误类型。你说的对。一旦我对此有所了解,我可能会将其移植到 std::function 上。

标签: c++ templates typedef member-function-pointers


【解决方案1】:

看起来问题是您也试图在右侧命名函数指针。以下为我编译:

template <typename T>
class Matrix { };

template <typename T>
class MyClass
{
public:
    Matrix<T> myFunc() { return {}; }
};

template <typename T>
using my_f = Matrix<T> (MyClass<T>::*)(); // NOTE: No myFunction here

int main() {
    my_f<double> f = &MyClass<double>::myFunc;
    return 0;
}

https://www.ideone.com/VdazMB

【讨论】:

  • 啊,我想就是这样。我只是要检查我的代码以查看一切是否正常,然后我会接受答案。非常感谢。我确实尝试了类似的方法,但没有使用 :: 这就是为什么它对我不起作用。
【解决方案2】:

作为替代方案,正如我在评论中已经建议的那样,您可以使用std::function,因为它更容易使用并且更通用。

template <typename T>
class matrix { };

template <typename T>
class MyClass
{
public:
    matrix<T> myFunction(matrix<T> const&) { return {}; }
};

template<typename T>
using calc_t = std::function<matrix<T>(matrix<T> const&)>;

int main()
{
    MyClass<double> myObject;

    using namespace std::placeholders;  // For e.g. _1
    calc_t<double> myFunction = std::bind(&MyClass<double>::myFunction, myObject, _1);

    matrix<double> myFirstMatrix, mySecondMatrix;
    myFirstMatrix = myFunction(mySecondMatrix);
}

如上所示,您可以使用std::bind。但你也可以使用lambda expressions:

calc_t<double> myFunction = [&](matrix<double> const& m)
{
    return myObject.myFunction(m);
};

或者更好(无论如何对于这个简单的用例)使用类型推导

auto myFunction = [&](matrix<double> const& m)
{
    return myObject.myFunction(m);
};

使用 lambdas、类型推导和模板,您可以以简单的方式创建非常通用、富有表现力和复杂的代码。

【讨论】:

  • 这是一个非常好的和彻底的答案。我刚刚涉足std::function,它似乎绝对是我应该使用的东西。感谢您解释如何改进我的代码!
猜你喜欢
  • 2017-11-01
  • 2021-06-22
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多