模板类函数指针类型别名

时间:2018-06-25 22:24:01

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

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

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

在哪里出现通用语法错误missing ')' before MyClass<T>::*myFunction

然后照常使用

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

对于使用using类型别名而不是非模板typedef而言,我不确定在这种特定情况下使用的语法。

我看了以下其他SO问题,这些问题似乎无法涵盖这种特定用法:

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

2 个答案:

答案 0 :(得分:3)

问题似乎是您也在尝试在右侧命名函数指针。以下为我编译:

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

答案 1 :(得分: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);
};

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