c++ - 类成员函数作为继承情况下的模板参数

标签 c++ templates c++14

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

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/

相关文章:

c++ - 传递字符串数组时出现段错误

指向全局函数的 C++ 类成员指针

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 为什么我们应该使用带有唯一指针的 std::move 语义?

c++ - 为什么 make_unique 不能与 unique_ptr::reset 一起使用?

c++ - 当其键不存在时初始化 std::map 值

c++ - X11:移动窗口时得到通知

Python/Tornado - 压缩静态文件

c++ - 为什么编译器需要指定类型?

c++ - 如何访问嵌套在命名空间内的未命名空间变量?