如果函数是在基类中实现的,则如何将函数指针作为模板参数传递。

template<class T, int(T::* FUNC)() const>
int TestFunc(const T& _v)
{
    return (_v.*FUNC)();
}

struct A
{
    int F() const   { return 100; }
};

struct B : public A {};

int main()
{
    B b;
    int32_t value = TestFunc<B, &B::F>(b);
    cout << value;
    //...
}

得到错误C2672:'TestFunc':找不到匹配的重载函数。

对于VS编译器,static_cast可以帮助:
typedef int(B::* BF)() const;
int32_t value = TestFunc<B, static_cast<BF>(&B::F)>(b);

这些已构建并成功运行,但是我需要使用clang进行构建。

有任何想法吗?

附言BF bf = &B::F;此转换无需强制转换即可工作,因此编译器可以理解B类具有F方法。但是它不能用作模板参数。

更新:P.P.S.实际的类和代码更加复杂。上面的示例只是一个非常简化的版本,用于概述问题。

解决方法:我目前使用的解决方法是在B类中重写F(),后者仅调用继承的方法,但仍在寻找更好的解决方案。

最佳答案

一种选择是仅使用A作为模板参数:

int32_t value = TestFunc<A, &A::F>(b);

关于c++ - 在继承的情况下,类成员函数用作模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57824211/

10-11 22:43
查看更多