gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:06:55 26 4
gpt4 key购买 nike

我有一个与 Morpheus 提出的问题非常相似的问题,在以下问题中:

Overloaded member function pointer to template

Richard Corden 提出的解决方案要求用户明确指定函数参数类型,以在重载中区分它。但是,此解决方案似乎不适用于具有不同数量的相同类型参数的重载。

考虑这个例子(源自原始问题):

template <typename T>
class A
{
public:
template<class Arg1>
void connect(void (T::*f)(Arg1))
{
//Do some stuff
}

template<class Arg1, class Arg2>
void connect(void (T::*f)(Arg1,Arg2))
{
//Do some stuff
}

void connect(void (T::*f)())
{
//Do some stuff
}
};

class GApp
{
public:
void foo() {}
void foo(double d) {}
void foo(double d1, double d2) {}
};


int main ()
{
A<GApp> a;
a.connect (&GApp::foo); // foo () - OK
a.connect<double> (&GApp::foo); // foo (double) - FAIL
a.connect<double,double> (&GApp::foo); // foo (double,double) - OK
}

GNU G++ 3.4.5 和 MSVC 2008 不编译上面的代码,都显示类似的错误消息:

test.cpp: In function `int main()':
test.cpp:36: error: call of overloaded `connect(<unknown type>)' is ambiguous
test.cpp:7: note: candidates are: void A<T>::connect(void (T::*)(Arg1)) [with Arg1 = double, T = GApp]
test3.cpp:13: note: void A<T>::connect(void (T::*)(Arg1, Arg2)) [with Arg1 = double, Arg2 = double, T = GApp]

我知道一些可以使其编译的解决方法,例如将指针分配给完全相同类型的变量(例如 void (GApp::*tmp)(double ) = &GApp::foo;) 或者,在调用连接函数时使用更明确的形式(例如 connect((void (GApp::*)(double))(&GApp::foo)) ;).

但是,我更喜欢第一种解决方案,并且想知道为什么它不起作用。

提前致谢!

最佳答案

对于 a.connect<double> (&GApp::foo) , foo(double)foo(double, double)将匹配 connect 的重载分别带有一个和两个模板参数(在双参数版本的情况下,将推导第二个模板参数,第一个参数由您明确提供)。

如果您想消除不明确的情况,我建议您传递确切的类型,这样就不会发生意外。除了那些重载,为什么不用一个重载

template<typename MType, typename T>
void connect(MType T::*f)
{
//Do some stuff
}

a.connect<void()> (&GApp::foo);
a.connect<void(double)> (&GApp::foo);
a.connect<void(double, double)> (&GApp::foo);

最后一次调用 connect也应该在您的代码中正常工作。然后你可以剖析类型 MTypeconnect使用单独的模板,获取参数和返回类型。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com