簡體   English   中英

模板類函數指針類型別名

[英]Template class function pointer type alias

我正在嘗試為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問題,這些問題似乎並未涵蓋此特定用法:

我嘗試了其他一些變體,但沒有成功。

看來問題在於您也在嘗試在右側命名函數指針。 以下為我編譯:

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

作為替代,正如我在評論已經建議,你可以使用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表達式

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

或者更好(無論如何對於這個簡單的用例)使用類型推導

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

使用lambda,類型推導和模板,您可以以簡單的方式創建非常通用,富有表現力的復雜代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM