この質問に関連して、それはおそらく過度に単純化されているので、ここでより複雑な例を示します。私がふりをする問題は、次のコードで表されます。
// test3.cpp
using namespace std;
template<typename T>
struct exer
{
template<typename R, typename... rArgs, typename... pArgs>
R operator()(R(T::*f)(rArgs...), pArgs&&... args)
{
return (t.*f)(forward<pArgs>(args)...);
}
T t;
};
struct A
{
int addition() { return 0; }
template<typename... Args>
int addition(int a, Args... args) { return a + addition(args...); }
};
struct B
{
public:
template<typename... Args>
int addition(Args&&... args)
{
return m_e(&A::addition, forward<Args>(args)...);
}
private:
exer<A> m_e;
};
int main()
{
B b;
cout << b.addition(1, 2, 3, 4) << endl;
}
ここでのこの問題は、のインスタンス化では、さまざまなオーバーロードが存在するためB::addition
、のタイプ&A::addition
が不明であるということです。さらに、B::addition
どのオーバーロードを使用する必要があるかもわかりません。これは、関数が呼び出されるまでコンパイラを認識しません。ただし、でオーバーロードを使用する必要があることを正しく指定するには、をキャストして正しいオーバーロードにキャストするexer<A>::operator()
必要があります。&A::addition
ターゲット関数の正しいオーバーロードのタイプを抽出するにはどうすればよいですか?