Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以从指向成员函数模板参数的指针推断类类型_C++_Templates_Pointer To Member_Type Deduction_Template Argument Deduction - Fatal编程技术网

C++ 是否可以从指向成员函数模板参数的指针推断类类型

C++ 是否可以从指向成员函数模板参数的指针推断类类型,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(){} }; 模板

是否可以从指向memmber
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)。这是这个问题的实际答案,因为它解决了前面提到的问题(我也在寻找这个问题)。