我正在尝试从基类中专门化一个静态模板函数,并认为这是typedef / using语句的一个很好的用例。但是,我似乎无法让它工作。这是非法的,还是我的语法错了?
#include <iostream>
class Base {
public:
template <typename T>
static T func () {
std::cout << (T)3.145 << std::endl;
}
};
class Derived : public Base {
public:
// using derivedFunc = Base::func<int>; // This doesn't work
// typedef Base::func<int> derivedFunc; // Nor this
static constexpr auto derivedFunc = &Base::func<int>; // But this seems to work
};
int main() {
Base::func<double>(); // Prints 3.145
Derived::derivedFunc(); // Prints 3
return 0;
}
答案 0 :(得分:1)
using
或typedef
期望类型创建类型别名,但是您传递的是值,即指向函数的指针。有效的最后一行确切地说:auto
被推导为一个指向函数指针的指针。如果你在没有 auto
的情况下编写,它会变得更加明确:
static constexpr int(*derivedFunc)() = &Base::func<int>;
或者如果你使用它:
using derivedFuncType = decltype(&Base::func<int>);
static constexpr derivedFuncType derivedFunc = &Base::func<int>;
在第一行显示如何从函数指针获取所需类型,并使用类型别名从中定义实际成员变量。
在所有情况下,您现在都有一个函数指针。指针本身为static
,因此可以使用Derived::derivedFunc
访问指针,并且可以使用Derived::derivedFunc()
调用 。