C++ 是否可以从指向成员函数模板参数的指针推断类类型
是否可以从指向memmberC++ 是否可以从指向成员函数模板参数的指针推断类类型,c++,templates,pointer-to-member,type-deduction,template-argument-deduction,C++,Templates,Pointer To Member,Type Deduction,Template Argument Deduction,是否可以从指向memmberT::*f的指针推断类T的类型,如下所示 struct Foo { void func(){} }; template<typename T, void (T::*f)()> void bar() { } int main() { bar<Foo,Foo::func>(); // bar<Foo::func>(); // Desired } structfoo { void func(){} }; 模板
T::*f
的指针推断类T
的类型,如下所示
struct Foo
{
void func(){}
};
template<typename T, void (T::*f)()>
void bar()
{
}
int main()
{
bar<Foo,Foo::func>();
// bar<Foo::func>(); // Desired
}
structfoo
{
void func(){}
};
模板
空条()
{
}
int main()
{
bar();
//bar();//需要
}
在C++11/14中,我会说不,除非您接受通过将指针作为函数参数传递来推断它:
template<typename T>
void bar(void(T::*f)())
{
}
int main()
{
bar(&Foo::func);
}
模板
空心条(空心(T::*f)()
{
}
int main()
{
bar(&Foo::func);
}
在C++17中,您可以有一个单参数函数模板,如所示,但无论如何都不能推导出类型
t
(如果这是目的,正如问题所示)。在C++17中,您可以编写
template<auto M>
void bar();
模板
空心钢筋();
允许
bar<&Foo::func>();
bar();
如果您有权访问C++17,则可以使用auto
模板参数和decltype
检查类类型:
struct Foo { void func(){} };
template<typename R, typename C, typename... Args>
C function_pointer_class(R (C::*)(Args...));
template<auto f>
std::enable_if_t<std::is_member_function_pointer_v<decltype(f)>>
bar() {
using class_t = decltype(function_pointer_class(f));
// stuff...
}
int main() {
bar<&Foo::func>();
}
struct Foo{void func(){};
模板
C函数\指针\类(R(C::*)(Args…);
模板
std::如果启用,则启用
bar(){
使用class_t=decltype(函数_指针_class(f));
//东西。。。
}
int main(){
bar();
}
您没有推断任何内容,而是显式指定模板参数。您可以使用类似于模板void bar(void(T::*f)(){/*使用T*/}
的方法来推断模板参数。我知道这一点,但还是要谢谢您。问题是Foo::func
必须是一个模板参数,我对此没有意见,但我希望避免识别/命名T
@skypjack。我想“命名”指向成员函数的指针,而不“命名”它所属的类,这样Jarod的建议就行了——唉,我只限于C++03。@没问题,我误解了这个问题。这是常有的事。无论如何,如果您仅限于C++03,我怀疑您没有机会将其作为函数参数传递。对不起,聪明+1(即使OP绑定到C++03)。这是这个问题的实际答案,因为它解决了前面提到的问题(我也在寻找这个问题)。