专门化基类的静态模板功能

时间:2015-07-09 18:43:01

标签: templates c++11 static typedef template-specialization

我正在尝试从基类中专门化一个静态模板函数,并认为这是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;
}

1 个答案:

答案 0 :(得分:1)

usingtypedef期望类型创建类型别名,但是您传递的是值,即指向函数的指针。有效的最后一行确切地说:auto被推导为一个指向函数指针的指针。如果你在没有 auto的情况下编写,它会变得更加明确:

static constexpr int(*derivedFunc)() = &Base::func<int>;

或者如果你使用它:

using derivedFuncType = decltype(&Base::func<int>);
static constexpr derivedFuncType derivedFunc = &Base::func<int>;

在第一行显示如何从函数指针获取所需类型,并使用类型别名从中定义实际成员变量。

Live example

在所有情况下,您现在都有一个函数指针。指针本身为static,因此可以使用Derived::derivedFunc访问指针,并且可以使用Derived::derivedFunc() 调用