Псевдоним типа указателя на функцию класса класса - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь создать псевдоним типа для функции (myFunction) внутри myClass.

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 в отличие от не шаблонного определения типа.

Я рассмотрел следующие другие вопросы SO, которые, кажется, не охватывают это конкретное использование:

Я пробовал другие варианты, но безуспешно.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

В качестве альтернативы, и, как я уже предлагал в комментарии, вы можете использовать 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.Но вы также можете использовать лямбда-выражения :

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

Или еще лучше (в любом случае, для этого простого варианта использования) использовать вывод типа

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

С лямбдами, вычитание типов и шаблоны вы можете создавать очень общий и выразительный и сложный код простым способом.

0 голосов
/ 26 июня 2018

Похоже, проблема в том, что вы пытаетесь назвать и указатель функции с правой стороны.Для меня скомпилировано следующее:

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

...