c++ - 成员函数指针的模板参数推导

标签 c++ templates

众所周知,模板参数可以是指向成员函数的指针。

所以我可以写:

struct Bar
{
    int fun(float x);
};

template <int (Bar::*FUN)(float)>
struct Foo
{ /*...*/ };

typedef Foo<&Bar::fun> FooBar;

但是,如果我希望 Bar 类型本身成为模板参数怎么办:

template <typename B, int (B::*FUN)(float)>
struct Foo
{ /*...*/ };

typedef Foo<Bar, &Bar::fun> FooBar;

现在,当我使用它时,我必须写两次Bar!

我的问题是:有没有办法强制编译器自动推断类类型?

目标是让它正常工作:

typedef Foo<&Bar::fun> FooBar;
typedef Foo<&Moo::fun> FooMoo;

最佳答案

简单的回答:不,没有。

问题在于 typedef Foo<&Bar::fun> FooBar;为了工作,模板必须有一个非类型参数,但是在声明模板时该参数的类型是未知的,这是无效的。另一方面,类型推导永远不会应用于模板的参数(仅适用于函数模板的参数,但那些是函数的参数,而不是模板)。

关于c++ - 成员函数指针的模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11745764/

相关文章:

c++ - 使用移动时不会发生复制省略

c++ - 函数模板中出现无效的转换错误,其返回值取决于其泛型类型

C++ 访问另一个类的公共(public)成员

c++ - qt C++信号与槽中删除函数错误的使用

C++ std::vector 问题

c++ - 在 map 中包含一个类模板

c++ - 如何在C++中声明Magnitude类型?

c++ - 为什么 C++ 中的这种部分特化会产生编译器错误 "invalid use of incomplete type"?

c++ - 在多态指针 vector 中搜索特定类型及其子类型

c++ - IOCTL_MOUNTMGR_QUERY_POINTS