模板 class 函数指针类型别名
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
类型别名而不是非模板化类型定义的语法。
我查看了以下似乎未涵盖此特定用法的其他 SO 问题:
Function pointer to member function
Function pointer type not recognized inside template class
我尝试了其他一些变体,但没有成功。
看来问题是您也在尝试命名右侧的函数指针。以下为我编译:
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;
}
作为替代方案,正如我已经在评论中建议的那样,您可以使用 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
. But you could also use 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、类型推导和模板,您可以以简单的方式创建非常通用、富有表现力的复杂代码。
我正在尝试为 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
类型别名而不是非模板化类型定义的语法。
我查看了以下似乎未涵盖此特定用法的其他 SO 问题:
Function pointer to member function
Function pointer type not recognized inside template class
我尝试了其他一些变体,但没有成功。
看来问题是您也在尝试命名右侧的函数指针。以下为我编译:
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;
}
作为替代方案,正如我已经在评论中建议的那样,您可以使用 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
. But you could also use 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、类型推导和模板,您可以以简单的方式创建非常通用、富有表现力的复杂代码。